issuekey,title,description,storypoint CLOV-1086,"Line coverage data is inconsistent","I'm running 2.4.1 on IDEA 7 and get inconsistent line and branch coverage in the editor: every line that is hit by the a test always gets ""1"" as the hitcount. ",2 CLOV-379,"Surefire classpath is incorrect when depending on a jar and a test-jar from the same maven module","We have two different applications that have the same symptom. Their test cases work properly when executed without clover, but when we run them with clover, they fail because classes or resource files are missing from the classpath. When running the builds with clover, the test cases are executed multiple times. Only the last time they run they fail. When checking the maven debug output (using the -X option), I found that the last time the test cases are run, a JAR file is missing from the classpath. With both applications it is a jar file from a maven module for which we both depend on the jar and test-jar types of the module. For example we have the following in the pom.xml file: ${parent.groupId} server-data-access ${version} test-jar test ${parent.groupId} server-data-access ${version} And for some reason, when the test cases are executed for the last time, the following second dependency is not included in the list of jars in the classpath. I have attached the pom.xml files from the module for which the test cases fail (server-web.pom), the pom.xml files from its parents, the pom.xml file for the module that generates both a jar and a test-jar (server-data-access.pom) and the log file that I get when running maven with the -X option. This is the classpath when the test cases fail (notice that /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-data-access/target/server-data-access-1.0.2-SNAPSHOT.jar is missing): build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-web/target/test-classes build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-web/target/classes build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/xml-apis/xml-apis/1.3.04/xml-apis-1.3.04.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-model/target/server-model-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/commons-lang/commons-lang/2.1/commons-lang-2.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-actions/target/server-actions-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/log4j/log4j/1.2.13/log4j-1.2.13.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/util/8.19.0/util-8.19.0.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/tk-util/8.19.0/tk-util-8.19.0.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/jboss/netty/netty/3.0.0.GA/netty-3.0.0.GA.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/springframework/spring/2.5.6/spring-2.5.6.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-core/target/server-core-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-data-access/target/server-data-access-1.0.2-SNAPSHOT-tests.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/commons-collections/commons-collections/2.1.1/commons-collections-2.1.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/antlr/antlr/2.7.6/antlr-2.7.6.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-annotations/3.3.0.ga/hibernate-annotations-3.3.0.ga.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-search/3.0.0.GA/hibernate-search-3.0.0.GA.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/apache/lucene/lucene-core/2.2.0/lucene-core-2.2.0.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/drools/drools-core/4.0.7/drools-core-4.0.7.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/mvel/mvel/1.3.1-java1.4/mvel-1.3.1-java1.4.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/j2ee/1.3/j2ee-1.3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/sun/xml/bind/jaxb-impl/2.1.3/jaxb-impl-2.1.3.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/javax/activation/activation/1.1/activation-1.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/common/common-configuration/1.0.25/common-configuration-1.0.25.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/opensymphony/oscache/2.1.1/oscache-2.1.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/bml-core/8.20.0-SNAPSHOT/bml-core-8.20.0-SNAPSHOT.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/cache/8.20.0-SNAPSHOT/cache-8.20.0-SNAPSHOT.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/common/common-spring-util/1.0.25/common-spring-util-1.0.25.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/esper/esper/2.2.0/esper-2.2.0.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/org/antlr/stringtemplate/3.1-b1/stringtemplate-3.1-b1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/quartz/quartz/1.5.2/quartz-1.5.2.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/mockrunner/mockrunner/0.3.1/mockrunner-0.3.1.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/common/common-abstract-unit-tests/1.0.25/common-abstract-unit-tests-1.0.25-tests.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/unittest/8.20.0-SNAPSHOT/unittest-8.20.0-SNAPSHOT.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-data-access/target/server-data-access-1.0.2-SNAPSHOT-tests.jar build 20-Nov-2008 08:47:57 [DEBUG] /opt/bamboo/.m2/repository/com/oracle/oracle_jdbc/10.2.0.2.0/oracle_jdbc-10.2.0.2.0.jar This is the classpath for when it succeeds: build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-web/target/test-classes build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-web/target/classes build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/xml-apis/xml-apis/1.3.04/xml-apis-1.3.04.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-model/target/server-model-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/commons-lang/commons-lang/2.1/commons-lang-2.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-actions/target/server-actions-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/log4j/log4j/1.2.13/log4j-1.2.13.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/util/8.19.0/util-8.19.0.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/tk-util/8.19.0/tk-util-8.19.0.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/jboss/netty/netty/3.0.0.GA/netty-3.0.0.GA.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/springframework/spring/2.5.6/spring-2.5.6.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-core/target/server-core-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-data-access/target/server-data-access-1.0.2-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/commons-collections/commons-collections/2.1.1/commons-collections-2.1.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/antlr/antlr/2.7.6/antlr-2.7.6.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/cglib/cglib/2.1_3/cglib-2.1_3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/asm/asm/1.5.3/asm-1.5.3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-annotations/3.3.0.ga/hibernate-annotations-3.3.0.ga.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-commons-annotations/3.3.0.ga/hibernate-commons-annotations-3.3.0.ga.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/hibernate/hibernate-search/3.0.0.GA/hibernate-search-3.0.0.GA.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/apache/lucene/lucene-core/2.2.0/lucene-core-2.2.0.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/drools/drools-core/4.0.7/drools-core-4.0.7.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/mvel/mvel/1.3.1-java1.4/mvel-1.3.1-java1.4.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/commons-io/commons-io/1.4/commons-io-1.4.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/j2ee/1.3/j2ee-1.3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/sun/xml/bind/jaxb-impl/2.1.3/jaxb-impl-2.1.3.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/xml/stream/stax-api/1.0-2/stax-api-1.0-2.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/javax/activation/activation/1.1/activation-1.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/common/common-configuration/1.0.25/common-configuration-1.0.25.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/opensymphony/oscache/2.1.1/oscache-2.1.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/bml-core/8.20.0-SNAPSHOT/bml-core-8.20.0-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/cache/8.20.0-SNAPSHOT/cache-8.20.0-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/common/common-spring-util/1.0.25/common-spring-util-1.0.25.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/esper/esper/2.2.0/esper-2.2.0.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/antlr/antlr-runtime/3.0.1/antlr-runtime-3.0.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/org/antlr/stringtemplate/3.1-b1/stringtemplate-3.1-b1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/quartz/quartz/1.5.2/quartz-1.5.2.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/mockrunner/mockrunner/0.3.1/mockrunner-0.3.1.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/common/common-abstract-unit-tests/1.0.25/common-abstract-unit-tests-1.0.25-tests.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/i4commerce/bml/unittest/8.20.0-SNAPSHOT/unittest-8.20.0-SNAPSHOT.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/Bamboo/xml-data/build-dir/MONITORING-NIGHTLY/monitoring-server/server-data-access/target/server-data-access-1.0.2-SNAPSHOT-tests.jar build 20-Nov-2008 08:45:07 [DEBUG] /opt/bamboo/.m2/repository/com/oracle/oracle_jdbc/10.2.0.2.0/oracle_jdbc-10.2.0.2.0.jar",2 CLOV-1083,"Setting special instrumentation output dir to a source dir deletes all source!",NULL,1 CLOV-579,"Add method/statement level instrumentation setting in project properties page ",NULL,1 CLOV-582,"Make Test Run Explorer perform better and stop locking the UI thread",NULL,4 CLOV-1085,"Message in Balloon after clean snapshot is bogus","# Clean shapshot # First Optimised test run the balloon message is ok (see CIJ-272 re my thoughts on it) # Second optmised test run has some odd figures in it relating to expected savings and total test run time. ",2 CLOV-1084,"No instrumentation Done, Always get two Tests run.","Although 0 instr. was done, I still see two tests run. {code} 2009-05-08 14:19:48,851 [8933804] INFO - a.clover.core_v2.5.0-build-dev - Updating existing database at '/Users/niick/work/CLOV-trunk/.clover/coverage.db'. 2009-05-08 14:19:49,638 [8934591] INFO - a.clover.core_v2.5.0-build-dev - Processing files at 1.5 source level. 2009-05-08 14:19:52,664 [8937617] INFO - a.clover.core_v2.5.0-build-dev - Clover all over. Instrumented 0 files (0 packages). 2009-05-08 14:19:52,664 [8937617] INFO - a.clover.core_v2.5.0-build-dev - Elapsed time = 3.026 secs. (0 files/sec, 0 srclines/sec) 2009-05-08 14:19:52,664 [8937617] INFO - over.idea.build.CloverCompiler - completed Instrumentation. 2009-05-08 14:19:53,738 [8938691] INFO - a.clover.core_v2.5.0-build-dev - Clover estimates having saved around 41 seconds on this optimized test run. The full test run takes approx. 41 seconds 2009-05-08 14:19:53,738 [8938691] INFO - a.clover.core_v2.5.0-build-dev - Clover included 2 test classes in this run (total # test classes : 84) 2009-05-08 14:19:54,689 [8939642] INFO - CloverProgressIndicator - Creating database 2009-05-08 14:19:54,690 [8939643] INFO - CloverProgressIndicator - Loading registry file 2009-05-08 14:19:56,686 [8941639] INFO - CloverProgressIndicator - Building Index 2009-05-08 14:19:56,686 [8941639] INFO - CloverProgressIndicator - Loading coverage data 2009-05-08 14:19:56,758 [8941711] INFO - CloverProgressIndicator - Reading per-test data 2009-05-08 14:19:56,995 [8941948] INFO - CloverProgressIndicator - Resolving coverage data 2009-05-08 14:19:57,345 [8942298] INFO - CloverProgressIndicator - Creating tree 2009-05-08 14:19:57,480 [8942433] INFO - CloverProgressIndicator - Tree model ready {code}",1 CLOV-573,"Clover should prompt to rebuild a project if its flush or initstring settings change",NULL,1 CLOV-701,"Test Columns are empty (or -1) in project.js when generated via a JSON report ","When a JSON report is generated, the test fields: ""ErroneousTests"":0,""FailingTests"":0,""FilteredElements"":0.42738318,""PassingTests"":0,""PcErroneousTests"":-1,""PcFailingTests"":-1,""PcPassingTests"":-1,""TestExecutionTime"":0,""Tests"":0, are all -1 or 0 in the project.js. e.g. https://bamboo.extranet.atlassian.com/browse/CCD-WCLV-488/artifact/Clover-HTML/project.js The test data is definitely available in the HTML report.",2 CLOV-906,"Clover-for-Grails generates an exception when using the -clover.view option on the Grails command line.","Clover-for-Grails generates an exception when using the -clover.view option on the Grails command line. According to Nick's assessment so far, this is a Windows-specific problem. See output below: {noformat} C:\grails-1.2.1\samples\petclinic>grails test-app -clover.on -clover.view Welcome to Grails 1.2.1 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: C:\grails-1.2.1 Base Directory: C:\grails-1.2.1\samples\petclinic Resolving dependencies... Dependencies resolved in 2641ms. Running script C:\grails-1.2.1\scripts\TestApp.groovy Environment set to test Clover: Using config: [on:true, view:true] Using clover license path: C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\plugins\clover-0.2\grails-app\conf\clover\clover-evaluation. license [clover-env] Loading clover.xml: jar:file:/C:/Documents%20and%20Settings/Giles%20Gaskell/.ivy2/cache/com.cenqua.clover/clover/jars/clover-3.0.0-m3.jar!/clover.x ml Using default clover-setup configuration. Clover: directories: [src/java, src/groovy, test, grails-app] includes: [**/*.groovy, **/*.java] excludes [**/conf/**, **/plugins/**] [clover-setup] Clover Version 3.0.0-m3, built on February 26 2010 (build-780) [clover-setup] Loaded from: C:\Documents and Settings\Giles Gaskell\.ivy2\cache\com.cenqua.clover\clover\jars\clover-3.0.0-m3.jar [clover-setup] Clover Evaluation License registered to Clover Grails Plugin. [clover-setup] You have 23 day(s) before your license expires. [clover-setup] Clover is enabled with initstring 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db' Clover: Forcing a clean to ensure Clover instrumentation occurs. Disable by setting: clover.forceClean=false [delete] Deleting directory C:\grails-1.2.1\samples\petclinic\target\classes [delete] Deleting directory C:\grails-1.2.1\samples\petclinic\target\test-classes [delete] Deleting directory C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover Clover: Compile start. [mkdir] Created dir: C:\grails-1.2.1\samples\petclinic\target\classes [groovyc] Compiling 2 source files to C:\grails-1.2.1\samples\petclinic\target\classes [clover-setup] Creating new database at 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db'. [groovyc] Compiling 17 source files to C:\grails-1.2.1\samples\petclinic\target\classes [clover-setup] Creating new database at 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db'. [mkdir] Created dir: C:\grails-1.2.1\samples\petclinic\target\test-reports\html [mkdir] Created dir: C:\grails-1.2.1\samples\petclinic\target\test-reports\plain Starting unit test phase ... [mkdir] Created dir: C:\grails-1.2.1\samples\petclinic\target\test-classes\unit [groovyc] Compiling 1 source file to C:\grails-1.2.1\samples\petclinic\target\test-classes\unit [clover-setup] Updating existing database at 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db'. ------------------------------------------------------- Running 1 unit test... Running test org.grails.samples.OwnerControllerTests...PASSED Tests Completed in 2015ms ... ------------------------------------------------------- Tests passed: 6 Tests failed: 0 ------------------------------------------------------- Starting integration test phase ... [copy] Copying 1 file to C:\grails-1.2.1\samples\petclinic\target\test-classes\integration [copy] Copying 1 file to C:\grails-1.2.1\samples\petclinic\target\test-classes [copy] Copied 3 empty directories to 2 empty directories under C:\grails-1.2.1\samples\petclinic\target\test-classes Clover: Compile start. [groovyc] Compiling 1 source file to C:\grails-1.2.1\samples\petclinic\target\classes [clover-setup] Updating existing database at 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db'. [copy] Copying 1 file to C:\grails-1.2.1\samples\petclinic\target\classes Clover: Compile start. [groovyc] Compiling 1 source file to C:\grails-1.2.1\samples\petclinic\target\classes [clover-setup] Updating existing database at 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db'. [junitreport] Processing C:\grails-1.2.1\samples\petclinic\target\test-reports\TESTS-TestSuites.xml to C:\DOCUME~1\GILESG~1\LOCALS~1\Temp\null1750708552 [junitreport] Loading stylesheet jar:file:/C:/Documents%20and%20Settings/Giles%20Gaskell/.ivy2/cache/org.apache.ant/ant-junit/jars/ant-junit-1.7.1.jar!/org/apac he/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl [junitreport] Transform time: 735ms [junitreport] Deleting: C:\DOCUME~1\GILESG~1\LOCALS~1\Temp\null1750708552 Tests PASSED - view reports in target\test-reports Clover: Tests ended [clover-historypoint] Clover Version 3.0.0-m3, built on February 26 2010 (build-780) [clover-historypoint] Loaded from: C:\Documents and Settings\Giles Gaskell\.ivy2\cache\com.cenqua.clover\clover\jars\clover-3.0.0-m3.jar [clover-historypoint] Clover Evaluation License registered to Clover Grails Plugin. [clover-historypoint] You have 23 day(s) before your license expires. [clover-historypoint] Writing report to 'C:\grails-1.2.1\samples\petclinic\.cloverhistory\clover-20100305112533.xml.gz' [clover-html-report] Clover Version 3.0.0-m3, built on February 26 2010 (build-780) [clover-html-report] Loaded from: C:\Documents and Settings\Giles Gaskell\.ivy2\cache\com.cenqua.clover\clover\jars\clover-3.0.0-m3.jar [clover-html-report] Clover Evaluation License registered to Clover Grails Plugin. [clover-html-report] You have 23 day(s) before your license expires. [clover-html-report] Not overwriting existing history point 'C:\grails-1.2.1\samples\petclinic\.cloverhistory\clover-20100305112533.xml.gz'. To force, set overw rite=""true"". [clover-html-report] Loading coverage database from: 'C:\Documents and Settings\Giles Gaskell\.grails\1.2.1\projects\petclinic\clover\db\clover.db' [clover-html-report] Loading historical coverage data from: 'C:\grails-1.2.1\samples\petclinic\.cloverhistory' [clover-html-report] Writing HTML report to 'C:\grails-1.2.1\samples\petclinic\build\clover\report' [clover-html-report] Done. Processed 1 packages in 3047ms (3047ms per package). [clover-html-report] Writing historical report to 'C:\grails-1.2.1\samples\petclinic\build\clover\report' [clover-html-report] Read 3 history points. [clover-html-report] using movers interval of 18 hours [clover-html-report] using movers interval of 18 hours [clover-html-report] Writing JSON historical-data to: C:\grails-1.2.1\samples\petclinic\build\clover\report\historical-json.js [clover-html-report] Done. Error executing script TestApp: java.lang.StringIndexOutOfBoundsException: String index out of range: 1 gant.TargetExecutionException: java.lang.StringIndexOutOfBoundsException: String index out of range: 1 at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:331) at gant.Gant$_dispatch_closure6.doCall(Gant.groovy:334) at gant.Gant$_dispatch_closure6.doCall(Gant.groovy) at gant.Gant.withBuildListeners(Gant.groovy:344) at gant.Gant.this$2$withBuildListeners(Gant.groovy) at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source) at gant.Gant.dispatch(Gant.groovy:334) at gant.Gant.this$2$dispatch(Gant.groovy) at gant.Gant.invokeMethod(Gant.groovy) at gant.Gant.processTargets(Gant.groovy:495) at gant.Gant.processTargets(Gant.groovy:480) Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 1 at java.lang.String.charAt(String.java:687) at java.util.regex.Matcher.appendReplacement(Matcher.java:703) at java.util.regex.Matcher.replaceAll(Matcher.java:813) at java.lang.String.replaceAll(String.java:2190) at _Events.launchReport(_Events.groovy:138) at _Events$_run_closure6.doCall(_Events.groovy:108) at _GrailsEvents_groovy$_run_closure5.doCall(_GrailsEvents_groovy:58) at _GrailsEvents_groovy$_run_closure5.call(_GrailsEvents_groovy) at _GrailsTest_groovy$_run_closure1.doCall(_GrailsTest_groovy:214) at TestApp$_run_closure1.doCall(TestApp.groovy:102) at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324) ... 10 more Error executing script TestApp: java.lang.StringIndexOutOfBoundsException: String index out of range: 1 Application context shutting down... Application context shutdown. {noformat}",1 CLOV-930,"Implement Test Optimization for Grails: -clover.optimize","Running -clover.optimize will: * save a clover.snapshot on the first build * use this, to discern the optimal set of tests and their order, to run for subsequent builds based on: ** which source files have been modified ** length of test ** test result - failed tests will always be re-run",2 CLOV-940,"clover + ant + GWT does not compile and test with clover.","https://support.atlassian.com/browse/BSP-2952 It looks like the GWT.clover.xxx are not executed. build 06-May-2010 17:24:30 Build sequence for target(s) `clover.fullclean' is [clover.clean, clover.fullclean] build 06-May-2010 17:24:30 Complete build sequence is [clover.clean, clover.fullclean, clover.save-history, GWT.clover.report, GWT.clover.json, checkstyle, common.checkstyle, buildonly, dist-dev, tools, apicheck-nobuild, apicheck, test, verify, common.all, build, doc, dist, -compile.emma.if.enabled, dev, GWT.with.clover, compile.emma.if.enabled, common.clean, GWT.clover.fullclean, common.build, GWT.clover.current, presubmit, all, GWT.clover.clean, GWT.clover.save-history, clover.snapshot, clover.json, clover.report, user, clover.log, common.compile.emma.if.enabled, ci, common.-compile.emma.if.enabled, GWT.clover.log, bikeshed, emma.merge, GWT.test, with.clover, jni, clean, clover.all, common.-create.emma.coverage.if.enabled, clover.xml, common.verify, -create.emma.coverage.if.enabled, buildtools, clover.current, samples, dist-bikeshed, soyc, GWT.clover.all, GWT.clover.xml, common.test, servlet, GWT.clover.snapshot, ] However targets without GWT are executed.",3 CLOV-951,"Assertion failing (call not made from EDT)","{code} Access is allowed from event dispatch thread only. Details: Current thread: Thread[ApplicationImpl pooled thread,5,Idea Thread Group] 1631384517 Our dispatch thread:Thread[AWT-EventQueue-1 9.0.2#IU-95.66, eap:false,6,Idea Thread Group] 1360788520 SystemEventQueueThread: Thread[AWT-EventQueue-1 9.0.2#IU-95.66, eap:false,6,Idea Thread Group] 1360788520 java.lang.Throwable com.intellij.openapi.diagnostic.Logger.error(Logger.java:55) com.intellij.openapi.application.impl.ApplicationImpl.a(ApplicationImpl.java:860) com.intellij.openapi.application.impl.ApplicationImpl.assertIsDispatchThread(ApplicationImpl.java:847) com.cenqua.clover.idea.coverage.DefaultCoverageManager.setCoverageTree(DefaultCoverageManager.java:176) com.cenqua.clover.idea.coverage.DefaultCoverageManager.clearCache(DefaultCoverageManager.java:160) com.cenqua.clover.idea.coverage.DefaultCoverageManager.setContextFilter(DefaultCoverageManager.java:151) com.cenqua.clover.idea.ProjectPlugin.getCoverageManager(ProjectPlugin.java:219) com.cenqua.clover.idea.config.ContextFilterPane.(ContextFilterPane.java:16) com.cenqua.clover.idea.config.ProjectConfigPanel.getFilterPane(ProjectConfigPanel.java:200) com.cenqua.clover.idea.config.ProjectConfigPanel.getTabbedContent(ProjectConfigPanel.java:120) com.cenqua.clover.idea.config.ProjectConfigPanel.getLicensedPanel(ProjectConfigPanel.java:82) com.cenqua.clover.idea.config.ProjectConfigPanel.initComponents(ProjectConfigPanel.java:63) com.cenqua.clover.idea.config.ProjectConfigPanel.(ProjectConfigPanel.java:54) com.cenqua.clover.idea.ProjectPlugin.createComponent(ProjectPlugin.java:328) com.intellij.openapi.options.newEditor.OptionsEditor$Simple.(OptionsEditor.java:1113) com.intellij.openapi.options.newEditor.OptionsEditor.b(OptionsEditor.java:350) com.intellij.openapi.options.newEditor.OptionsEditor.access$2100(OptionsEditor.java:63) com.intellij.openapi.options.newEditor.OptionsEditor$6$1.run(OptionsEditor.java:328) com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:695) com.intellij.openapi.options.newEditor.OptionsEditor$6.run(OptionsEditor.java:326) com.intellij.openapi.application.impl.ApplicationImpl$5.run(ApplicationImpl.java:329) java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) java.util.concurrent.FutureTask.run(FutureTask.java:138) java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) java.lang.Thread.run(Thread.java:637) com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:125) Access is allowed from event dispatch thread only. Details: Current thread: Thread[ApplicationImpl pooled thread,5,Idea Thread Group] 1631384517 Our dispatch thread:Thread[AWT-EventQueue-1 9.0.2#IU-95.66, eap:false,6,Idea Thread Group] 1360788520 SystemEventQueueThread: Thread[AWT-EventQueue-1 9.0.2#IU-95.66, eap:false,6,Idea Thread Group] 1360788520 java.lang.Throwable com.intellij.openapi.diagnostic.Logger.error(Logger.java:55) {code}",2 CLOV-953,"Occasionally clover is getting broken on the Hudson ","We are using Grails 1.2.2 , Hudson, clover From time to time Hudson fails with the following console output. Without any changes the next build can be fine. Licensed under Apache Standard License 2.0 Grails home is set to: D:\Apps\grails-1.2.2 Base Directory: D:\Apps-Pub\HUDSON_HOME\jobs\LifePoints\workspace\Lifepoints WARNING: Dependencies cannot be resolved for plugin [clover-3.0.2] due to error: null Resolving dependencies... Dependencies resolved in 1422ms. Running script D:\Apps\grails-1.2.2\scripts\TestApp.groovy Environment set to test Clover: Using config: [on:true] Using clover license path: D:\Apps-Pub\HUDSON_HOME\jobs\LifePoints\workspace\Lifepoints/clover.license [taskdef] Could not load definitions from resource cloverlib.xml. It could not be found. Error executing script TestApp: Problem: failed to create task or type clover-env Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any / declarations have taken place. : Problem: failed to create task or type clover-env Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any / declarations have taken place. org.apache.tools.ant.UnknownElement.getNotFoundException(UnknownElement.java:484) org.apache.tools.ant.UnknownElement.makeObject(UnknownElement.java:416) org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:160) _Events.toggleCloverOn(_Events.groovy:302) _Events$_run_closure3.doCall(_Events.groovy:56) _GrailsEvents_groovy$_run_closure5.doCall(_GrailsEvents_groovy:58) _GrailsEvents_groovy$_run_closure5.call(_GrailsEvents_groovy) _GrailsEvents_groovy.run(_GrailsEvents_groovy:62) _GrailsEvents_groovy$run.call(Unknown Source) _GrailsClean_groovy$run.call(Unknown Source) _GrailsClean_groovy.run(_GrailsClean_groovy:29) _GrailsClean_groovy$run.call(Unknown Source) TestApp.run(TestApp.groovy:44) TestApp$run.call(Unknown Source) gant.Gant.processTargets(Gant.groovy:494) gant.Gant.processTargets(Gant.groovy:480) Error executing script TestApp: Problem: failed to create task or type clover-env Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any / declarations have taken place.",3 CLOV-964," does not work with Ant groovyc task","Since TestSourceSet is not Serializable it doesn't work with Ant/groovyc. {noformat}Clover failed to integrate with java.io.NotSerializableException: com.cenqua.clover.tasks.TestSourceSet at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302) at java.util.ArrayList.writeObject(ArrayList.java:569) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917) ... at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302) at com.atlassian.clover.instr.java.InstrumentationConfig.saveToFile(InstrumentationConfig.java:427) at com.atlassian.clover.ant.groovy.GroovycSupport.newConfigDir(GroovycSupport.java:360) at com.atlassian.clover.ant.groovy.GroovycSupport.augmentCompilationClasspath(GroovycSupport.java:350) at com.atlassian.clover.ant.groovy.GroovycSupport.taskStarted(GroovycSupport.java:160) at org.apache.tools.ant.Project.fireTaskStarted(Project.java:2182){noformat} ",1 CLOV-977,"Clover's embedding of GSON brings in ""assembly-descriptor.xml"" into clover.jar which causes problems for ejbdoclet, others","see support case https://support.atlassian.com/browse/CLV-5576 and forum post http://forums.atlassian.com/thread.jspa?messageID=257357810 the solution is to simply exclude this file when building the clover.jar ",1 CLOV-987,"Cannot select contexts in IDEA 10.0.2","I select either the filter button in the coverage panel or go via the project settings (same either way) to get to the clover setting dialog. I select the 3rd tab (Contexts) and check the check-boxes 'catch bosy' and 'property methods'. The boxes become checked but the Apply button remains disabled (this is the main issue). I add a new custom context - and the Apply button is enabled. I click apply and the check boxes all reset back to their un-set state. The custom context remains. ",1 CLOV-991,"Ternary clauses never executed still get coverage","I don't know if this is disoverable at all, but the following example will work with any ternary statement: @Test public void testTernaryStatement() { ternaryStatement(true); } public static void ternaryStatement(boolean bool) { String value = bool ? ""true"" : ""false""; System.out.println(value); } This will mark the entire ternary statement as covered, while the false branch was in fact never triggered. Since Clover is primarily a coverage tool, I marked this issue Major.",2 CLOV-1007,"clover2:check fails with negative coverage if no class to instrument","This happens either if no java class was found for instrumentation or if they were all excluded. Clover then reports a negative coverage of -100%. To my mind, this is not correct : strictly speaking, if no java class has to be tested for coverage, there is no relevant coverage value (I guess it is what the -100% means) but check should be OK. ",1 CLOV-1011,"Coverage data not showing up in Intellij","I've got the dev build from CLOV-1004, which worked for Intellij 10.3 but since I upgraded to 10.5.1, neither the latest public rev (3.1.0.v20110608114626-dev) nor the dev version of the plugin from CLOV-1004 works. In the projects view, it looks like the code is instrumented. But after I run a test, no coverage information is displayed. When I explicitly update the clover database, nothing is updated. The ""Test Runs"" view behaves as if I never ran a test.",1 CLOV-1015,"Test Optimization says 0 tests should run but all tests are run anyway","Recently upgraded my Maven builds to use the Maven Surefire plugin version 2.9. Now my builds that run Clover2:optimized and say 0 tests should run, run all tests anyway. The upshot of this is that our optimized test runs are now taking over an hour versus the 15 to 20 minutes they were when the tests were correctly optimized away. Here is a section of the log file that shows the problem: {noformat} [shell] cd dba; mvn -PPERSONAL,UnitTests,Clover.optimize -Djava.awt.headless=true --offline -Dforkmode=once -Dmaven.download.meter=silent -DskipAssembly -Dmaven.test.failure.ignore=true -Dmaven.test.redirectTestOutputToFile=false -Dmaven.clover.licenseLocation=/prodinfolocal/BambooHome/clover.license -Dclover.plugin.version=3.1.0 -Dclover.version=3.1.0 install clover2:aggregate clover2:clover [INFO] NOTE: Maven is executing in offline mode. Any artifacts not already in your local repository will be inaccessible. [INFO] Scanning for projects... [WARNING] Profile with id: 'PERSONAL' has not been activated. [WARNING] Profile with id: 'UnitTests' has not been activated. [INFO] ------------------------------------------------------------------------ [INFO] Building dba [INFO] task-segment: [install] [INFO] ------------------------------------------------------------------------ [INFO] [clover2:setup {execution: clover}] [INFO] No Clover instrumentation done on source files in: [/Users/mhusby/workarea/dba/src/main/java] as no matching sources files found [INFO] No Clover instrumentation done on source files in: [/Users/mhusby/workarea/dba/src/test/java] as no matching sources files found [WARNING] Using [Squid:configuration:jar:1.0-SNAPSHOT], built on Fri Jul 22 15:44:02 EDT 2011 even though a Clovered version exists but it's older (lastModified: Fri Jul 22 15:43:02 EDT 2011 ) and could fail the build. Please consider running Clover again on that dependency's project. [INFO] [resources:resources {execution: default-resources}] [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 2 resources [INFO] Copying 1 resource [INFO] [compiler:compile {execution: default-compile}] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources {execution: default-testResources}] [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 6 resources [INFO] [compiler:testCompile {execution: default-testCompile}] [INFO] Nothing to compile - all classes are up to date [INFO] [clover2:optimize {execution: clover}] [INFO] Adding fileset: directory=/Users/mhusby/workarea/dba/target/clover/src-test-instrumented, includes=[**/*Tests.*, **/*Test.*, **/Test*.*, qxjShouldNeverMatchAClass], excludes=[**/*TestCase.*, **/Test*Servlet.*, **/Abstract*.*, **/*FormModuleTests.*, **/*.xml, **/*$*.*] [INFO] Clover estimates having saved around 44 seconds on this optimized test run. The full test run takes approx. 44 seconds [INFO] Clover included 0 test classes in this run (total # test classes : 22) [INFO] [surefire:test {execution: default-test}] [INFO] Surefire report directory: /Users/mhusby/workarea/dba/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running edu.mit.broad.prodinfo.dba.BlobDefTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.327 sec Running edu.mit.broad.prodinfo.dba.LongDefTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running edu.mit.broad.prodinfo.dba.ExceptionWrapperTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running edu.mit.broad.prodinfo.dba.DoubleDefTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running edu.mit.broad.prodinfo.dba.CacheMapTest Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.108 sec Running edu.mit.broad.prodinfo.dba.OurDBsTest Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.596 sec Running edu.mit.broad.prodinfo.dba.VArrayDefTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec Running edu.mit.broad.prodinfo.dba.VArrayFormatterTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec Running edu.mit.broad.prodinfo.dba.RowDefTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.311 sec Running edu.mit.broad.prodinfo.dba.BigDecimalDefTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec Running edu.mit.broad.prodinfo.dba.DoubleFormatterTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec Running edu.mit.broad.prodinfo.dba.DateFormatterTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec Running edu.mit.broad.prodinfo.dba.LongFormatterTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running edu.mit.broad.prodinfo.dba.ClobDefTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec Running edu.mit.broad.prodinfo.dba.DBTest Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.778 sec Running edu.mit.broad.prodinfo.dba.DataIteratorTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec Running edu.mit.broad.prodinfo.dba.ProcedureDefTest Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.052 sec Running edu.mit.broad.prodinfo.dba.VArrayListTest Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec Running edu.mit.broad.prodinfo.dba.DBPoolTest Tests run: 8, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 39.08 sec Running edu.mit.broad.prodinfo.dba.StringDefTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Running edu.mit.broad.prodinfo.dba.DataDefIteratorTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec Running edu.mit.broad.prodinfo.dba.RowTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.54 sec Results : Tests run: 49, Failures: 0, Errors: 0, Skipped: 1 [INFO] [clover2:snapshot {execution: clover}] [INFO] No span specified, using span of: 48s [INFO] Saving snapshot to: /Users/mhusby/.clover/Squid-dba/clover.snapshot [INFO] Clover Version 3.1.0, built on May 31 2011 (build-821) [INFO] Loaded from: /Users/mhusby/.m2/repository/com/cenqua/clover/clover/3.1.0/clover-3.1.0.jar [INFO] Clover: Academic License registered to Broad/MIT Institute. [INFO] Updating snapshot '/Users/mhusby/.clover/Squid-dba/clover.snapshot' against Clover database at '/Users/mhusby/workarea/dba/target/clover/clover.db' {noformat}",5 CLOV-1018,"Can't Use ""Google App Engine"" Run Configuration in IDEA 10.5 when Clover Plug-in is Installed","I am trying to start a GAE run configuration in IDEA 10.5 - after compilation and the web artifact being built, the process simply fails to start, with no errors. I uninstalled the plug-in and the process once again starts correctly. I also attempted to create a plain Java Application run configuration to start the process instead and this also fails with the same issue. The GAE libraries are pulled in as module libraries, via a Maven POM. I'm not sure if this is linked, but there definitely seems to be a problem with Run configurations when the main Java class being run is located in an external library, rather than being part of the project code-base. I've checked the IDEA logs and no errors are thrown. The plain Java Application run configuration had the following settings: Main Class: com.google.appengine.tools.development.DevAppServerMain VM Parameters: -Dappengine.sdk.root= -javaagent:/lib/agent/appengine-agent.jar Program Parameters: --disable_update_check Working Directory: ",2 CLOV-1025,"Log the actual percentage coverage instead of ""Coverage check PASSED"".","Clover logs the minimum percentage: Checking for coverage of [90.0%] for database But not the actual percentage. Coverage check PASSED Please add this logging, in order to help us know when it's safe to bump the threshold higher.",1 CLOV-1056,"IDEA 11 error turning OFF Clover coverage","Error during dispatching of java.awt.event.MouseEvent[MOUSE_CLICKED,(691,256),absolute(1963,178),button=1,modifiers=Button1,clickCount=1] on frame0 java.lang.NullPointerException clover.net.sf.jtreemap.swing.JTreeMap$Zoom.setNewDimension(JTreeMap.java:694) clover.net.sf.jtreemap.swing.JTreeMap$Zoom.execute(JTreeMap.java:664) clover.net.sf.jtreemap.swing.JTreeMap.zoom(JTreeMap.java:570) clover.net.sf.jtreemap.swing.JTreeMap$HandleMouseClick.mouseClicked(JTreeMap.java:616) java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270) java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:269) java.awt.Component.processMouseEvent(Component.java:6507) javax.swing.JComponent.processMouseEvent(JComponent.java:3321) java.awt.Component.processEvent(Component.java:6269) java.awt.Container.processEvent(Container.java:2229) java.awt.Component.dispatchEventImpl(Component.java:4860) java.awt.Container.dispatchEventImpl(Container.java:2287) java.awt.Component.dispatchEvent(Component.java:4686) java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) java.awt.LightweightDispatcher.processMouseEvent(Container.java:4501) java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) java.awt.Container.dispatchEventImpl(Container.java:2273) java.awt.Window.dispatchEventImpl(Window.java:2713) java.awt.Component.dispatchEvent(Component.java:4686) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) java.awt.EventQueue.access$000(EventQueue.java:101) java.awt.EventQueue$3.run(EventQueue.java:666) java.awt.EventQueue$3.run(EventQueue.java:664) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) java.awt.EventQueue$4.run(EventQueue.java:680) java.awt.EventQueue$4.run(EventQueue.java:678) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.awt.EventQueue.dispatchEvent(EventQueue.java:677) com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:694) com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:530) com.intellij.ide.IdeEventQueue.b(IdeEventQueue.java:416) com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:374) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) java.awt.EventDispatchThread.run(EventDispatchThread.java:90) ",2 CLOV-1062,"Clover-for-Groovy failed to instrument Groovy sources having methods overridden by metaClass ","We were able to get clover report from maven-clover2-plugin even for groovy classes successfully. However when we try to override a method via Groovy metaclass in some tests, clover plugin fails on these tests. We simply added the following lines to our tests. MyClass.metaClass.myMethod = { return ""called"" } Clover plugin gave the following error. Exception in thread ""main"" BUG! exception in phase 'instruction selection' in source unit Test.groovy Clover-for-Groovy failed to instrument Groovy source: Test.groovy I attached the full stacktrace for further details.",13 CLOV-1077,"Missing icons on TreeView and Cloud Report tabs","On IDEA 11 the ""Tree View"" and ""Cloud Report"" tabs have missing icons. See attached screenshot. ",2 CLOV-1082,"Write up on CAC how to get Clover working with Maven and integration tests","In particular: * numClients=1 should be set in the config * that the test runner JVM should not have -Dclover.distributed.coverage=ON set as this will override the numClients setting * that a context listener that starts on webapp start needs to be registered in web.xml so that the webapp Clover runtime connects back to the test runner JVM so that tests proceed ",1 CLOV-1087,"Prepare tutorial how to configure distributed coverage for web applications","Extend a following page: http://confluence.atlassian.com/display/CLOVER/Working+with+Distributed+Applications or add a subpage. Prepare a step-by-step tutorial how to set compile options, deploy artifacts and set container options in order to test web applications. Things to be considered (not a complete list): * fact that -Dclover.distributed.coverage=ON it will use the default settings including the default numClients=0 * numClients must be set to 1 in order to have blocking unit tests * we need a servlet context listener to avoid circular dependency: unit tests are waiting for business code to connect, but business code will not connect until first request (which will be triggered by unit tests)",1 CLOV-1090,"Consistent statistics reporting in IDE and HTML reports for subpackages","See https://answers.atlassian.com/questions/11664/package-summary-including-sub-packages A problem is as follows. In IDE (IntelliJ/Eclipse) in the Coverage view when we see statistics for given package it is a aggregated summary of the package and all its subpackages. By clicking ""Flatten packages"" we can see statistics for a package without subpackages. See idea1.png. In HTML report we can see aggregated coverage only for the whole project. When we click on a certain package, we see statistics gathered only from classes from given package and not its subpackages. See html1.png and html2.png. The expected behaviour is as follows: 1) When we click on the ""Coverage"" link in top-left frame in HTML report, the functionality shall be as it is now. I.e. it should open in the right (main) frame a list of packages, a statistics panel in the top-right corner will show stats for whole project, clicking on a package on the list will open a package details frame with stats in top-right corner for the package only. 2) When we click on the ""Coverage (Aggregate)"" link in top-left frame, it will open in right frame list of package and a statistics panel for whole project (as it is now). But when user clicks on a package from list it will open a different package details frame with aggregated stats in top-right corner for the package and all subpackages. 3) A stats panel for option 1 shall have a label like ""Statistics for package (without subpackages) "" and for option 2 like ""Statistics for package (with subpackages) "" 4) A stats panel should have a link ""show with subpackages"" / ""show without subpackages"" for easy switch between reports. See html3.png *Update:* In new HTML report introduced in Clover 4, a package-level page could look this way: [^clover4-adg-package.png] so that toggle buttons would be similar to those a project-level page: [^clover4-adg-project.png] ",3 CLOV-1092,"Finish About+Clover-for-Grails page","Complete content on http://confluence.atlassian.com/display/CLOVER/About+Clover-for-Grails and make it visible. Expand http://confluence.atlassian.com/display/CLOVER/Coverage+Legend Retake screengrab - with more context - i.e. bigger image and provide an explanation of the columns. Expand http://confluence.atlassian.com/display/CLOVER/Source+Cross-Referencing+in+Reports Add image with mouse pointer - i.e. hyperlinks within the code. Try to avoid getting the tooltip in the image as it is unrelated to the (point of the) hyperlink itself. Add more examples for advanced setuptask / reporttask configuration. ",1 CLOV-1097,"Guide users through Eclipse setup","Our current Clover-for-Eclipse documentation is hard to follow. First it tells you how to enable Clover for your projects, mentions briefly that the views will pop up but won't have anything interesting on them yet, and then goes into great detail about each view. It would be helpful to instead walk the user through how to enable Clover for a project, and then go straight to configuration. There's no need to explain the views until there's something to show on them! It would also be helpful to describe how a project should be laid out. Do you need your test classes in the same Eclipse project as your source code, for example? ",2 CLOV-1100,"Drop support for Eclipse 3.4, 3.5 and RAD 7.5","Drop support for Eclipse 3.4.x and RAD 7.5. These tools are practically unused. Background: According to the latest 2012 [Eclipse community survey|http://ianskerrett.wordpress.com/2012/06/08/eclipse-community-survey-result-for-2012/] the 3.4 version is being used by 0.7% of users; 3.5 is used by 2.3% of users. Rational Application Developer 8.0 which is based on Eclipse 3.6 is available since September 2010, so since nearly two years - i.e. we can expect that IBM customers had a lot of time to upgrade to the latest RAD. The previous version of RAD 7.5 (based on Eclipse 3.4) was released in 2008. To do: * update http://confluence.atlassian.com/display/CLOVER/Supported+Platforms page * update clover-for-eclipse build scripts and manifest files ",1 CLOV-1105,"license information inconsistent in IDEA","see screenshot",1 CLOV-1106,"bad alignment of ""About"" box in IDEA","see screenshot",1 CLOV-1108,"Eclipse does not exclude filtered-out methods from statistics","When we define certain methods to be filtered-out in Eclipse, they are being marked as not executed (hit count = 0) instead of not being taken into consideration at all (no hit count). What's interesting, an HTML report generated from Eclipse use filters correctly. Metrics in Eclipse says: 4 methods, 4 statements; Metrics in HTML says: 3 methods, 3 statements. See attached screenshots.",1 CLOV-1109,"Unit test failure during Clover2 custom lifecycle do not fail builds","The Maven Clover2 plugin creates a custom lifecycle. When the unit tests are run in that lifecycle the build will not fail if there are test failures. This is because the lifecycle.xml file forces the Surefire plugin's testFailureIgnore configuration property to false. This is especially problematic in Jenkins builds where unit tests should fail the build (rather than allowing them to be unstable). Please remove this configuration or replace it with a mechanism that can be set in the POM. The file in question is src/main/resources/META-INF/maven/lifecycle.xml. See the [related Answers discussion|https://answers.atlassian.com/questions/61973/clover-ignore-dmaven-test-failure-ignore-false].",2 CLOV-1111,"Prepare tutorial how to instrument RCP application under Eclipse","Prepare manual on confluence.atlassian.com describing how to instrument and run RCP application under Eclipse IDE. Topics to be covered: * ""Run with Clover as ..."" vs ""Run as ..."" * various options in Run Configuration dialog * adding Clover dependency via Xbootclasspath or manually created plugin * exporting instrumented code (plugins, fragments, features, product) * config.ini for product and Xbootclasspath - running exported product (separately) and running it in IDE Prepare also code example showing how we can use Clover with RCP application. Open issue: how to distribute it with Clover-for-Eclipse. Options: * prepare sample aside and attach as zip to manual on confluence * implement a wizard so that using ""File > New > Example > Clover RCP Example"" will generate sample projects in workspace (preferred solution, but more work effort) ",1 CLOV-1112,"Reading clover database across platforms does not resolve path correctly for FileInfo","Clover database contains FileInfo objects for every source file. One of FileInfo fields is an absolute path to given file. When database is written, it uses current platform file separator for file name ('\' for windows, '/' for Linux/MacOS). However, when database is read it interprets file name using again current platform file separator. As a consequence, when database is generated on Windows and report generated on Linux, it cannot resolve file name properly - it takes whole path as a single path segment, resulting in paths like: /path/from/report/generation/sourcepath/D:/path/from/instrumented/build/file.java As a consequence report generation does create html file containing source code with highlighted coverage.",1 CLOV-1129,"Prepare manual how to set-up cross-platform testing","Write how to set up Clover in case when someone is using a test framework not written in Java - for example shell scripts, C/C++ code. How to wrap this so that Clover can not only execute, but also optimize such tests. ",1 CLOV-1131,"Unicode CR/LF characters in javadoc causes Eclipse/IntelliJ editors get out of sync","Try the following example: {code:java} class Unicode { void foo() { System.out.println(""1""); /** {@code \u000a} LF */ } void goo() { System.out.println(""2""); /** {@code \u000d} CR */ } void hoo() { System.out.println(""3""); } } // end {code} In Eclipse editor, every CR/LF written in unicode causes that it interprets it as newline character. As a result left ruler ""sees"" more lines and all subsequent coverage blocks are shifted down. In IntelliJ it's even worse, as we get exception. Stack trace: {noformat} Error during dispatching of java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=com.cenqua.clover.idea.content.ContentPlugin$1@789e7511,notifier=null,catchExceptions=false,when=1343648365649] on sun.awt.windows.WToolkit@2018aa27: Wrong end: 270; document length=249; start=246 java.lang.IllegalArgumentException: Wrong end: 270; document length=249; start=246 com.intellij.openapi.editor.impl.RangeMarkerImpl.(RangeMarkerImpl.java:47) com.intellij.openapi.editor.impl.DocumentImpl.createRangeMarker(DocumentImpl.java:303) com.intellij.openapi.editor.impl.RangeHighlighterImpl.(RangeHighlighterImpl.java:58) com.intellij.openapi.editor.impl.MarkupModelImpl.a(MarkupModelImpl.java:119) com.intellij.openapi.editor.impl.MarkupModelImpl.addRangeHighlighter(MarkupModelImpl.java:135) com.cenqua.clover.idea.content.DocMarkupPlugin$HighlightMarkupBuilder.highlightStatement(DocMarkupPlugin.java:286) com.cenqua.clover.idea.content.DocMarkupPlugin$HighlightMarkupBuilder.process(DocMarkupPlugin.java:220) com.cenqua.clover.idea.content.DocMarkupPlugin.updateMarkups(DocMarkupPlugin.java:136) com.cenqua.clover.idea.content.DocMarkupPlugin.refresh(DocMarkupPlugin.java:424) com.cenqua.clover.idea.content.ContentPlugin$1.run(ContentPlugin.java:96) java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646) java.awt.EventQueue.access$000(EventQueue.java:84) java.awt.EventQueue$1.run(EventQueue.java:607) java.awt.EventQueue$1.run(EventQueue.java:605) java.security.AccessController.doPrivileged(Native Method) java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) java.awt.EventQueue.dispatchEvent(EventQueue.java:616) com.intellij.ide.IdeEventQueue.f(IdeEventQueue.java:627) com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:508) com.intellij.ide.IdeEventQueue.b(IdeEventQueue.java:405) com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:369) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) java.awt.EventDispatchThread.run(EventDispatchThread.java:122) {noformat} ",2 CLOV-1132,"Fix Clover-for-IDEA compatibility with IntelliJ IDEA 12","IDEA12 is going to be released quite soon. Make sure that Clover will work on it properly: http://blogs.jetbrains.com/idea/2012/08/meet-august-with-new-intellij-idea-12-eap-build-120305/ http://confluence.jetbrains.net/display/IDEADEV/Leda+120.305+Release+Notes http://confluence.jetbrains.net/display/IDEADEV/IDEA+12+EAP",4 CLOV-1135,"Coverage ruler does not read settings from Preferences","A left ruler showing code coverage markers is always reading default color values (defined in plugin.xml), instead of current settings from IDE (Window > Preferences > ... Text editors > Annotations). Note that color in text editor is updated correctly. See attached screenshot. ",1 CLOV-1136,"Coverage ruler does not refresh correctly when all source code annotations are disabled","A left Clover coverage ruler does not refresh correctly after change in coverage in case when we don't have Clover-related source code annotations enabled. Steps to reproduce: - install Clover, enable it for a Moneybags project, perform full rebuild - open MoneyBagTest -> coverage is red - open Window > Preferences > Editors > Text editors > Annotations - for all ""Clover: xxx"" annotation types disable ""Vertical ruler"", ""Overview ruler"" and ""Text as"" checkboxes - run opened test case (right click, run as, junit test) Result: - JUnit view shows that tests were executed, Coverage Explorer view is also updated correctly, but the ruler is still highlighted in red - now scroll the text editor up and down - ruler refreshes during repaint; (the same happens when editor is reopened or resized) See attached screenshot. Expected result: 1) ruler should refresh automatically when coverage data is changed, no matter whether source annotation is enabled or not OR 2) ruler should not draw any color if corresponding source code annotation is disabled ",2 CLOV-1137,"Remove grover*.jar after build","A maven-clover2-plugin creates a groover*.jar file in $java.io.tmpdir directory. This JAR is next being dynamically added as a build dependency artifact. It must be available till end of the build. Unfortunately Maven has nothing like post-build-cleanup phase (which would be always executed at end of build). We need a workaround for this, for example: 1) Create a new Clover goal, like clover2:post-build-cleanup, which will remove this file. 2) Alternatively, find a way to add Clover groovy runtime classes to classpath, so that creation of JAR file would not be needed anymore. As soon as this bug is fixed, a corresponding update of Bamboo Clover Plugin is necessary. See linked issue. *Solution implemented:* Instead of playing with post-build cleanup, there are two new options available in taks (Ant) and clover2:setup / clover2:instrument goals (Maven): * skipGroverJar - if set to true it will not extract artifact at all (can be used only if there's no Groovy code in a project) * groverJar - target location of grover.jar file (fixed name and location instead of generating temporary file name in java.io.tmpdir) ",2 CLOV-1138,"Create utility for upgrading third party libraries bundled in Clover","In Clover-for-Ant we have an upgrade.xml Ant script, which can repackage clover.jar and install new version of jfreechart library into it. We shall extend this script to support replacement of all third party libraries used in Clover. Such script should be also available for Clover-for-Eclipse and Clover-for-IDEA. Keep in mind that we have to retrotranslate third party classes during repackaging to have them compatible with Java 1.4. Keep in mind that we have to prefix java packages with ""clover."" in order to avoid name space conflicts. Packages: * com.google.gson * com.atlassian.* (Atlassian API) * com.keypoint.* * com.lowagie.* * gnu.cajo.* * it.unimi.dsi.fastutil.* * org.apache.commons.* * org.apache.log4j.* * org.apache.oro.* * org.apache.velocity.* * org.codehaus.groovy.antlr (?) * org.jfree * retrotranslator * org.apache.tools.ant.* (?) ",1 CLOV-1140,"Make Clover-for-Android prototype publicly available","Take a ShipIt prototype prepared by Michael, merge with the latest Clover version, make it working on Eclipse ADT, publish manual how to use it on CAC/Clover-for-Android page. ",5 CLOV-1141,"Refresh Clover-for-Scala prototype","Tasks: * take Scala prototype https://confluence.atlassian.com/display/DEV/ShipIt+12+Delivery+-+Clover+for+Scala, * change the code so that it will use new Clover Service Provider Interface - CLOV-1142 * make it working with the latest Clover code base (version 4.0.x), ",13 CLOV-1142,"Expose a Service Provider Interface for Clover for handling new languages","Create a Service Provider Interface for Clover, which will allow to attach new source code and/or byte code instrumenters. It will allow us to create a pluggable architecture so that new programming languages (e.g. Scala, JRuby, Jython, Closure) could be supported. *Rough idea:* * new language instrumenters can be attached by META-INF/services ** they can provide some callback like canInstrument(File) or canInstrument(InstrumentationSource) ** clover shall pass file/instrumentation source to such instrumenter together with Clover's configuration and an open instrumentation session ** extension instruments on its own calling session.enterXyz()/exitXyz() methods ** extension writes output file on its own ** language instrumenter could work also with an Abstract Syntax Tree (e.g. Groovy or Scala - we may need a different way of attaching here) * new language renderers can be attached by META-INF/services - move to another issue? ",8 CLOV-1143,"Remove obsolete pages from Clover 3.1 space","Hi Melanie, May I ask your team to delete following pages from CLOVER space? All of them are obsolete or available in spaces for older Clover releases. They are unnecessarily cluttering current documentation. https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.3.2+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.3+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.0+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.1+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.0+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.3+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.2+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.1+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.0+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2-beta5+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2-beta4+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2-beta3+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2-beta2+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.1-beta1+for+IDEA https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.3+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.2+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.0+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.1+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.0+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.3+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.2+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.0+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.1+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.2.1+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.1.0+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.3+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.2+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.1+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.0+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.0.b2_1+for+Eclipse https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.3+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.2+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.1+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.3+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.2+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.1+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.2.1+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.2.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.1.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0b2+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0b1+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0a5+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0a4+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0a3+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0a2+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0a1+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.3+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.2+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.1+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.0.0+for+Ant https://confluence.atlassian.com/display/CLOVER/Changes+in+2.6.0+for+Maven+2 https://confluence.atlassian.com/display/CLOVER/Changes+in+2.5.0+for+Maven+2 https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.3+for+Maven+2 https://confluence.atlassian.com/display/CLOVER/Changes+in+2.4.2+for+Maven+2 https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.2+for+Maven+2 https://confluence.atlassian.com/display/CLOVER/Changes+in+2.3.0+for+Maven+2 https://confluence.atlassian.com/pages/viewpage.action?pageId=110035179 https://confluence.atlassian.com/pages/viewpage.action?pageId=134873325 https://confluence.atlassian.com/pages/viewpage.action?pageId=103710921 https://confluence.atlassian.com/display/CLOVER/%5BTRASH%5D+Using+Clover+for+Maven+2+with+the+gwt-maven-plugin https://confluence.atlassian.com/display/CLOVER/%5BTRASH%5D+Using+Clover+with+the+GWT-maven+plugin https://confluence.atlassian.com/pages/viewpage.action?pageId=93683890 https://confluence.atlassian.com/pages/viewpage.action?pageId=71599635 https://confluence.atlassian.com/display/CLOVER/%5BTRASH%5D+Clover-for-Eclipse+User%27s+Guide https://confluence.atlassian.com/display/CLOVER/%28hidden+draft%29+Clover-for+Eclipse+Upgrade+Guide ",1 CLOV-1144,"Support *.groovy files in src/main/java folder for groovy-eclipse-plugin","*Problem:* Clover fails during instrumentation of *.groovy files in case when sources are put in src/main/java directory, instead of src/main/groovy and when the groovy-eclipse-plugin is used. *Steps to reproduce:* * create a project with groovy-eclipse-plugin and maven-clover2-plugin * put a *.groovy file inside src/main/java * run build *Expected error:* {noformat} [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.201s [INFO] Finished at: Mon Sep 10 10:16:48 CDT 2012 [INFO] Final Memory: 7M/18M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal com.atlassian.maven.plugins:maven-clover2-plugin:3.1.7:setup (default-cli) on project test.project: Clover has failed to instrument the source files in the [C:\workspaces\workspace\TestProject\target\clover\src-instrumented] directory -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal com.atlassian.maven.plugins:maven-clover2-plugin:3.1.7:setup (default-cli) on project test.project: Clover has failed to instrument the source files in the [C:\workspaces\workspace\TestProject\target\clover\src-instrumented] directory org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319) org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) org.apache.maven.cli.MavenCli.main(MavenCli.java:141) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) Caused by: org.apache.maven.plugin.MojoExecutionException: Clover has failed to instrument the source files in the [C:\workspaces\workspace\TestProject\target\clover\src-instrumented] directory com.atlassian.maven.plugin.clover.internal.instrumentation.AbstractInstrumenter.instrumentSources(AbstractInstrumenter.java:197) com.atlassian.maven.plugin.clover.internal.instrumentation.AbstractInstrumenter.instrument(AbstractInstrumenter.java:72) com.atlassian.maven.plugin.clover.CloverInstrumentInternalMojo.execute(CloverInstrumentInternalMojo.java:309) com.atlassian.maven.plugin.clover.CloverSetupMojo.execute(CloverSetupMojo.java:31) org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) ... 19 more [ERROR] [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException *** ERROR: No source files specified USAGE: com.cenqua.clover.CloverInstr [OPTIONS] PARAMS [FILES...] {noformat} A reason is that Java compiler is involved here, Clover is called, it filters out all files which do not have *.java extension and as a consequence it passes wrong argument to CloverInstr. *Solution:* 1) Add check to AbstractInstrumenter (maven-clover2-plugin) so it does not call CloverInstr in case no matching files are found 2) Add support for src/main/java, src/test/java directories for Groovy - probably in GroovySourceScanner + CloverInstrumentInternalMojo *Workaround:* Put Groovy files in correct location i.e. src/main/groovy - they'll be handled correctly by Clover. *Background:* According to groovy-eclipse-plugin documentation, they recommend putting groovy files inside java folder - it's not nice, but it's the fastest set-up. http://groovy.codehaus.org/Groovy-Eclipse+compiler+plugin+for+Maven",3 CLOV-1148,"Implement integration with Maven Tycho Plugin","Currently Clover-for-Maven cannot handle maven build with the maven-tycho-plugin. More details here: https://answers.atlassian.com/questions/1919/maven-3-tycho-and-clover To be done: hack the maven-tycho-plugin and intercept its internal call of javac compiler and instrument sources on the fly.",4 CLOV-1149,"Make possible to see instrumented sources in Clover-for-Eclipse","Clover-for-Eclipse: Clover instrumentation in performed in memory during compilation. As a consequence when there is any build error, we can see original source only and cannot check whether the problem lies in the Clover instrumenter itself. For example, in Clover-for-IDEA we can see instrumented sources because they're stored in temporary directory. To be implemented: add an option to get instrumented sources in Eclipse too.",1 CLOV-1150,"Clover does not instrument groovy source files, (groovy-eclipse compiler) when located in src/main/groovy","When building a groovy project with maven, I am trying to get clover code coverage reports. With all source files in .java and in src/main/java, clover works fine. However, with all source files in .groovy and in src/main/groovy, clover can not instrument the files (clover2:instrument, or clover2:setup). Everything that I can find is saying that clover versions after 3.1.3 support the maven groovy eclipse compiler (so long as the groovy files are located in src/main/groovy). See this ticket: https://jira.atlassian.com/browse/CLOV-1021?page=com.atlassian.jira.plugin.system.issuetabpanels:changehistory-tabpanel There is another support ticket that I found that seems to cover the same issue, however I cannot access it. Here is the link https://support.atlassian.com/browse/CLV-5878 A partial output log is included here. I will try to come up with a small test project that I can upload here. Any help would be appreciated. ",5 CLOV-1151,"Clover fails to find coverage snapshot files when IBM JRE is used","*Problem:* it seems that IBM JRE implementation differs from Oracle JRE in such way that Object.hashCode() can return a negative value. As a consequence, file name suffix generated for coverage snapshot and test slice snapshot may be composed not only of '0-9a-z_' characters, but also have minus ""-"" sign in it. As a result such file name does not match regular expression used for searching of coverage files and coverage is not read. *Workaround:* rename coverage snapshot file(s) and remove ""-"" character. ",1 CLOV-1154,"Inconsistent popup menu in different IDEA versions","IDEA 10 and newer is not showing the ""Exclude from compile"" option when sources are instrumented. In IDEA9 it was working fine. See 'popup_menu_in_ideas.png' screenshot. My suspicion is that IDEA somehow does not treat instrumented file as a source code, thus hiding this option from popup menu. What's more, when you click on the ""Jump to source"" it opens the Explorer window, instead of opening the source file in IDEA. See also: META-INF/plugin.xml com.cenqua.clover.idea.CloverPlugin.initComponent() com.intellij.openapi.actionSystem.IdeActions; @NonNls String GROUP_COMPILER_ERROR_VIEW_POPUP = ""CompilerErrorViewPopupMenu""; com.intellij.compiler.imp.CompilerErrorTreeView.addExtraPopupMenuActions(); ",2 CLOV-1155,"Simple installer for Clover-for-IDEA","When someone downloads the Clover-for-IDEA from www.atlassian.com he gets clover-idea-x.x.x.jar file. What to do next? Of course you have to open IDEA, select Settings > Plugins > Install from disk, but user might not know. Especially when taking into account that ""Install from disk"" is not available in older IDEA versions. New feature: provide simple installer for Clover-for-IDEA. When user double-clicks on a JAR, a GUI installer starts (class defined in MANIFEST.MF) which asks for location of IDEA installation. Simple check whether selected folder contains config/plugins directory and copy jar into given location. Show also message how it can be installed from IDEA GUI. Business value: makes Clover evaluation easier. ",2 CLOV-1156,"Refresh clover.atlassian.com","The http://clover.atlassian.com/ page was not updated for last 2 years. Re-activate Bamboo builds related with this site to have live data. Add a link to this page on main Clover product page: http://www.atlassian.com/software/clover/overview ",1 CLOV-1157,"Run with Clover as on a project with no Clover","Clover-for-Eclipse. When you have a project with Clover disabled, the ""Run with Clover as"" and ""Run optimized"" buttons are still active. It makes no sense, buttons should be grayed-out.",1 CLOV-1158,"Test Run Explorer does not show test contribution with optimized run","When you execute optimized test runs, the Test Run Explorer does snow show test contribution data.",1 CLOV-1159,"Create small legend for Top Risks and Quick Wins in Cloud report","Currently user does not know what the font size and colour means until he reads the documentation. Add small legend box or at least a single-line description for these two reports. Affects HTML report as well as Eclipse/IDEA views. ",1 CLOV-1160,"Change default sort order in coverage report for packages/classes/methods","Coverage report - show the least covered packages/classes/methods first. Table should not start with the highest coverage (starting from 100%) at the top, because developer is not interested in code which is already covered and tested, but in white spots. Add the possibility to sort by any column. Affected: HTML/IDE",2 CLOV-1161,"Add drop-down with two options for coverage","Add the ""drop-down"" listbox which will have ""show cumulative coverage"" and ""show coverage from last run"" options. It should be added in Eclipse and IDEA. Note that the ""span"" option is already available (Window > Preferences > Clover) but we can have either: * have time-based span or * set it to 0seconds which means load everything. Background reason: coverage is cumulative. Some customer have pointed out that coverage data for successive incremental change/save/compile/test cycles can lie and show coverage that's no longer there. That's because we aggregate all coverage data since the last full rebuild. We will hopefully have a better way of showing this in the future. In the meantime, scrubbing the coverage for a project and re-running the tests will show the coverage of tests just run. ",2 CLOV-1162,"Generate cumulative statement / complexity metric for need of methodContext filtering","A method context has maxComplexity / maxStatements attributes which allow to reduce the scope of context filter for methods where these metrics are lower than defined level (by default maxComplexity/maxStatements is Int.MAX_VALUE, i.e. all methods are taken into account). Example: {code:xml} {code} However, customer reported a problem that it excludes methods containing inline classes, for instance: {code:java} // the getListener() method has only one statement: ""return ;"" // if you use // then the whole code block will be filtered-out, including the actionPerformed() method ActionListener getListener() { return new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(""statement #1""); System.out.println(""statement #2""); } }; } {code} In the case above ActionListener() is an inner class so it has their own metrics. And because of fact that context filters are ""cumulative"" (so that whenever any code pattern is matched, then the whole block is excluded), the whole getListener() method is filtered-out, including inner class. *Solution:* We cannot change existing metrics (without breaking backward compatibility) and we cannot change the way how blocks are excluded (it would make no sense). But we can create new metrics called: cumulativeComplexity and cumulativeStatements. It would work as follows: * for every interface, class, enum or method find all inner classes, interfaces, enums or methods (*) ** this can be checked by matching occupied code regions (on a database level during metric calculation - preferred) or during instrumentation (code parser) * calculate cumulativeComplexity and cumulativeStatements by adding cumulative value from all inner objects to current entity complexity/statements value * add maxCumulativeComplexity / maxCumulativeStatments to Ant clover-setup/clover-instr and Maven clover2:setup / clover2:instr goals ** html reports would probably remain unchanged (just grey-out) (*) yes we should make code more flexible in order to make it ready to support code constructs like default methods in Java8 interfaces or Scala's functions inside functions etc ",8 CLOV-1165,"Fix AbstractAntLogger","The AbstractAntLogger class logs the message only if Ant Task is not null: {noformat} protected void antLog(Project proj, Task task, String aMsg, int antLogLevel) { if (task != null) { proj.log(task, aMsg, antLogLevel); } } {noformat} As a consequence, no log is availalbe in case when code it's called outside Ant - problem was found in open-source Gradle Clover Plugin.",1 CLOV-1166,"Clover does not work with Groovy 2.x","*Problem:* Clover instrumentation fails for Groovy 2.x with a stack trace like below: {noformat} BUILD FAILED c:\Work\support\clv-5892-groovyjarjarasm\tutorial\build.xml:32: java.lang.IncompatibleClassChangeError at com.atlassian.clover.instr.groovy.bytecode.RecorderGetterBytecodeInstruction.visit(RecorderGetterBytecodeInstruction.java:109) at org.codehaus.groovy.classgen.AsmClassGenerator.visitBytecodeSequence(AsmClassGenerator.java:1771) at org.codehaus.groovy.classgen.BytecodeSequence.visit(BytecodeSequence.java:64) at org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:81) at org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.writeBlockStatement(OptimizingStatementWriter.java:155) at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:455) at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:101) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:112) at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:319) at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:276) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123) at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:396) at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1056) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50) at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:180) at org.codehaus.groovy.control.CompilationUnit$14.call(CompilationUnit.java:786) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1027) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:564) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:542) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:519) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:498) at org.codehaus.groovy.tools.FileSystemCompiler.compile(FileSystemCompiler.java:57) at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:213) at org.codehaus.groovy.ant.Groovyc.runCompiler(Groovyc.java:947) at org.codehaus.groovy.ant.Groovyc.compile(Groovyc.java:994) at org.codehaus.groovy.ant.Groovyc.execute(Groovyc.java:630) {noformat} *Reason:* RecorderGetterBytecodeInstruction extends org.codehaus.groovy.classgen.BytecodeInstruction and implements a following method: public void visit(groovyjarjarasm.asm.MethodVisitor methodVisitor) In Groovy 1.x MethodVisitor is an interface. In Groovy 2.x MethodVisitor is a class. Although RecorderGetterBytecodeInstruction compiles correctly with both Groovy versions, it fails at runtime during bytecode verification, becase visit() method gets different bytecode signature. *Solution:* Compile RecorderGetterBytecodeInstruction against two different Groovy versions. Load proper version using reflections at runtime. ",2 CLOV-1167,"Grails Clover Plugin does not intercept 'testc' compiler","Grails 2.x has introduced a new compiler for building unit tests (from test/unit directory). The 'testc' task is the *org.codehaus.groovy.grails.test.compiler.GrailsTestCompiler* Build log looks like this: {noformat} |Compiling 1 source files ... [testc] ... \test\unit\clover\test\UnitTests.groovy |Compiling 1 source files ... [groovyc] ... \test\integration\IntegrationServiceTests.groovy {noformat} Clover does not intercept this compiler call (it supports Groovyc, Grailsc, GrailsCompiler). As a consequence unit tests are not instrumented and not included in coverage.",1 CLOV-1170,"CloverOptimizerMojo does not support full include/exclude syntax","*Problem:* CloverOptimizerMojo does not support full include/exclude syntax, which can be handled by maven-surefire-plugin. Two cases are not handled right now: (1) multiple paths separated by comma {noformat} **/Test1.java, **/Test2.java {noformat} (2) regular expression instead of Ant-style pattern {noformat} %regex[.*Test.class] {noformat} See: http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html *Workaround:* (1) use separate entries, like: {noformat} **/Test1.java **/Test2.java {noformat} (2) not available; user can try to replace regexp by set of Ant-style patterns *Implementation:* CloverOptimizerMojo relies an Ant-style patterns underneath. The CloverOptimizerMojo.createFileSet() method has {noformat} private FileSet createFileSet(Project antProject, final File directory, List includes, List excludes) { FileSet testFileSet = new FileSet(); ... testFileSet.appendIncludes((String[]) includes.toArray(new String[includes.size()])); } {noformat} fix for (1) - split every element in includes/excludes arrays using the comma delimiter and pass expanded arrays to appendIncludes() fix for (2) - find all elements from includes/excludes arrays having %regexp keyword, run file search on _directory_ using a filename matcher with regexp, create include/exclude for every file matched ",1 CLOV-1173,"Add maxComplexity / maxStatements for Clover-for-Maven","Ant has extra maxComplexity and maxStatements attributes available which are not supported in Maven plugin, for example: {code:xml} {code} in Maven we have _name_ and _regexp_ attributes only: {code:xml} ((.* )?public .*(get|set|is)[A-Z0-9].* {code} *Possible solution* Create which would accept entries like: {code:xml} simple_method (.* )?public .*(get|set|is)[A-Z0-9].* 10 10 20 20 ... more ... {code} Alternatively, extend parsing of existing tag so whenever it finds the entry it will not treat it as name of new context but as a structure from sample above. See also CLOV-1162.",2 CLOV-1175,"Make HTML report more consistent about number of classes","See attached screenshot. HTML report should list interfaces too.",2 CLOV-1176,"The clover-log should use default test detection if testSources are not defined","*Steps to reproduce:* 1) Add following target to clover-ant-X.Y.Z/tutorial/build_completed.xml: {code:xml} {code} 2) Run {noformat} ant -f build_completed.xml -Dtest.target=test.run clover.all {noformat} It will produce output like: {noformat} clover.log: [clover-log] Report for code : APPLICATION [clover-log] Coverage:- [clover-log] Methods: 61/62 (98,4%) [clover-log] Statements: 171/178 (96,1%) [clover-log] Branches: 40/48 (83,3%) [clover-log] Total: 94,4% ... [clover-log] Report for code : TEST [clover-log] Coverage:- [clover-log] Methods: 0/0 ( - ) [clover-log] Statements: 0/0 ( - ) [clover-log] Branches: 0/0 ( - ) [clover-log] Total: - ... [clover-log] Report for code : ALL [clover-log] Coverage:- [clover-log] Methods: 61/62 (98,4%) [clover-log] Statements: 171/178 (96,1%) [clover-log] Branches: 40/48 (83,3%) [clover-log] Total: 94,4% {noformat} *Result:* All classes were qualified to APPLICATION; if we compare it with XML or HTML reports, test and application classes are distinguished there. This is normal behaviour because requires the tag to be defined, for instance: {code:xml} {code} works fine. *Improvement:* Try to use the [default test detection algorithm|https://confluence.atlassian.com/display/CLOVER/Clover+test+detection] in order to find test classes. It would work in the same way as [|https://confluence.atlassian.com/display/CLOVER/clover-setup] task when the tag is not defined. ",3 CLOV-1177,"Errors in ErrorLog when toggling between projects with Dashboard view active","1) Toggle between cloverized projects. Dashboard visible. Message: Unexpected URI in the Dashboard view: C:\Users\Marek\.workspace-eclipse-3.4.2\Moneybags\.clover\report\dashboard-eclipse.html {noformat} java.net.URISyntaxException: Illegal character in opaque part at index 2: C:\Users\Marek\.workspace-eclipse-3.4.2\Moneybags\.clover\report\dashboard-eclipse.html java.net.URI$Parser.fail(Unknown Source) java.net.URI$Parser.checkChars(Unknown Source) java.net.URI$Parser.parse(Unknown Source) java.net.URI.(Unknown Source) com.cenqua.clover.eclipse.views.dashboard.DashboardLocationListener.changing(DashboardLocationListener.java:62) {noformat} 2) Right click on a closed project, which was cloverized before. Dashboard view visible. Message: Error creating the dashboard {noformat} java.lang.NullPointerException com.cenqua.clover.eclipse.views.dashboard.DashboardGenerator.execute(DashboardGenerator.java:41) com.cenqua.clover.eclipse.views.dashboard.DashboardView.generateReport(DashboardView.java:100) com.cenqua.clover.eclipse.views.dashboard.DashboardView.projectSelected(DashboardView.java:91) com.cenqua.clover.eclipse.views.dashboard.DashboardView.selectionChanged(DashboardView.java:130) org.eclipse.ui.internal.AbstractSelectionService.firePostSelection(AbstractSelectionService.java:179) org.eclipse.ui.internal.AbstractSelectionService$2.selectionChanged(AbstractSelectionService.java:71) {noformat} 3) Cloverized project selected in Package Explorer, Dashboard view opened. Close the selected project. Message: Problem generating Dashboard report {noformat} java.lang.NullPointerException com.cenqua.clover.eclipse.views.dashboard.DashboardView.ensureReportFolderCreated(DashboardView.java:107) com.cenqua.clover.eclipse.views.dashboard.DashboardView.generateReport(DashboardView.java:97) com.cenqua.clover.eclipse.views.dashboard.DashboardView$1.run(DashboardView.java:153) org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) {noformat} ",1 CLOV-1178,"Fix ruler coloring when include coverage from passed only is enabled","Eclipse. Java Editor. Left ruler showing coverage colours (green/yellow/blue). Rules shows ""yellow coverage"" when the ""include from passed only"" option is enabled. There should be no yellow colour in such case. Note: source code is highlighted correctly, metrics are fine too. See screenshot.",1 CLOV-1179,"Highlight whole method body if method is not covered","If given method was not executed at all, the HTML report shows red highlighting only for method header. It's not a bug in code - our Velocity templates are just written this way. We should highlight the whole method body in red - in the same way as Eclipse/IntelliJ does. See screenshot. ",5 CLOV-1181,"Multiple test cases in Test Run Explorer in IDEA","Quickly click 'run' button in order to execute multiple sets of unit tests in parallel. IDEA runs them in parallel, as a consequence we've got duplicated test cases on a list. See attached screenshot. Affects all supported IDEA versions. We should have test cases from last test run only.",2 CLOV-1182,"Multiple test cases in Test Runs view in Eclipse","If unit tests are executed several times since the last build, the Test Run view shows multiple test results. Not a bug actually, but it could be improved by showing last results only. See screenshot. Affects all supported eclipse versions. ",3 CLOV-1183,"Cloud Report in IDEA shows interfaces","Cloud Report in IDEA is inconsistent with a Cloud Report in Eclipse - it shows interfaces, which does not actually have any executable code. It shows also annotations. Fix: don't list objects (interfaces, classes) which do not have any statements in the Cloud Report. Note that simple check if !isInterface() is not sufficient as interfaces in Java8 will have default methods with code.",2 CLOV-1184,"Check Now button does not work if project is not opened in IDEA","Install the latest Clover plugin version in IDEA. Click Settings > IDE Settings > Clover > Auto Update > Check now button. If project is opened then pop-up is shown that the latest version is already installed. If no project is opened (i.e. you're on a IDEA's welcome page), pop-up is not shown. See attached images. Problem occurs on IDEA 11.x and 12.x. ",1 CLOV-1185,"Test optimization is broken in IDEA11 and above","JetBrains have changed sth in IDEA 11 regarding unit test run configuration, as a consequence Clover does not ""see"" and thus does not optimize all unit tests. Problem does not occur on IDEA 9.x, 10.x, 10.5.x. It is present on IDEA 11.x and probably also on 12.x. See attached images.",2 CLOV-1186,"IDEA12 JavaSourceTransformingCompiler functionality has been removed","Since build 122.694 Clover 3.1.8 cannot work with IDEA12 EAP, because the ""external"" build functionality was introduced and the JavaSourceTransformingCompiler is no longer supported. See issue http://youtrack.jetbrains.com/issue/IDEA-94612",5 CLOV-1187,"Don't spam the console with println anytime clover grails plugin is installed","From looking at the _Events.groovy hooks in the plugin, there are several println statements which will execute in all contexts, not just testing and not just when clover.on is specified. Specifically, the set classpath and compile start/end hooks will happen everytime any Grails command is run. This is bad practice for a plugin. The println statements should be changed to use the grailsConsole which is available automatically println ""foo"" => grailsConsole.log ""foo"" or grailsConsole.updateStatus ""foo"" Secondly, this should probably be wrapped in a helper which only prints if the the clover is enabled, ie: def logStuff(msg) { if( config.on ) grailsConsole.log msg }",1 CLOV-1188,"Aggregate coverage by current author and commit regex","I love CIJ. When I use git, I find myself making a lot of commits, and I want to see my test coverage aggregated by the jira ticket I've put in my commit log. For example, let's say I'm working on a project for 3 days. I might make 50 commits. All throughout my development, I'd like to keep a running track of how the test coverage is *for my code, bounded by a commit regex*. In other words, I'd like to use something like git blame, married with coverage, to give me feedback like ""Hey Zim, the feature you're working on only has 52% coverage"". Awesome-er still would be something like the class coverage pane, but using only lines I've changed. So I could have a window that shows the classes I've changed, and a summary of the coverage for the lines that I've changed, again bounded by a the jira ticket in my commit logs. This would be crazy to do in something other than a lightning fast DVCS like git or mercurial...but I have totally drunk the git cool aid.",13 CLOV-1190,"The tag from is not passed to groovyc","As in subject. As a consequence, the DefaultTestDetector is always used for Groovy code. *Fix:* Build proper TestDetector instance in GroovycSupport, which will be next serialized into InstrumentationConfig (instrumentation.ser file), so that next the Grover can deserialize it and pass to InstrumentingCodeVisitor. ",2 CLOV-1192,"Create ClassInfo objects for anonymous inline classes","During implementation of CLOV-1162 I've found that anonymous inline classes does not have their own ClassInfo object crated. Instead of this, methods of inline class are added to the enclosing class. For instance, a following code: {code:java} public class AggregatedMetrics { /** * Inner class, case with a method having an inline anonymous class * statements = 3 (sum of direct methods' statements) * aggregatedStatements = 5 (sum of direct methods' aggregated statements) */ class C { /** * Method: statements = 2; aggregatedStatements = 4 (method's statements + inline class aggregated statements) */ Iterator methodThree() { int d = 4; /** * Inline class: statements = aggregatedStatements = 2 (sum of its methods) */ return new InstrumentationSessionImplTestSample2() { /** statements = aggregatedStatements = 1 */ public boolean hasNext() { return false; } /** statements = aggregatedStatements = 1 */ public Object next() { return null; } /** statements = aggregatedStatements = 0 */ public void remove() { } }; } /** statements = aggregatedStatements = 1 */ void methodFour() { int e = 5; } } } {code} is stored in clover database in this way: {code:xml} {code} It means that on reports the AggregatedMetrics.C class is presented as having 5 methods, while it has 2 actually. It's not a bug. There was a design decision to not present anonymous classes in a report. Possible improvement: * create ClassInfo objects for anonymous classes * add option for reporting whether to show anonymous classes (like InstrumentationSessionImplTestSample2$1) or not ",5 CLOV-1193,"as a developer I don't need to run Clover on JDK1.4 anymore","*Idea:* Sun Java 1.4 has: * end of public updates - Oct 2008 * end of Premier Support - Feb 2010 * end of Extended Support - Feb 2013 * see http://www.oracle.com/technetwork/java/eol-135779.html IBM Java 1.4: * is no longer Generally Available (GA) since Dec 2004; * its End Of Servcie (EOS) will expire on September 2013: * see https://www.ibm.com/developerworks/java/jdk/lifecycle/ According to various sources, most popular are Java6 and Java7; Java1.4 has a fraction of market right now: * http://www.statowl.com/java.php although the report above shows Java version in web browser. Production environment may be different (especially regarding IBM Java). *Benefits:* Dropping support for Java 1.4 would ease Clover development a lot, as we could: * directly use Java5 generics in code * replace raw collections (List, Map, Set etc) by typed collections (List etc) in code * get rid of Retrotranslator (2x faster build ) * it opens a door to introduce generic-based libraries in Clover code (for example replace Apache Commons by Guava) *Tasks:* * update Supported-Platforms page * remove retrotranslator from build scripts * update bamboo / maven configurations * affects Clover, Clover-for-Maven2&3, Clover-for-Eclipse, Clover-for-IDEA (note that Clover-for-Grails already need JDK1.5 or above) *Out of scope:* * replacing existing raw collections by typed ones (like List -> List ), introducing foreach loops etc ** this will be done gradually during daily development ",1 CLOV-1195,"Groovy 2.x @CompileStatic annotation causes static methods to be ignored by Clover","Adding @CompileStatic to a tested Groovy class results in 0% coverage for static methods. e.g. {code} //All ok here class MyClass{ String sayHello(){ 'hello' //Full coverage shown by Clover } static String sayHelloAgain(){ 'hello again' //Full coverage shown by Clover } } //Same class with the annotation @CompileStatic class MyClass{ String sayHello(){ 'hello' //Full coverage shown by Clover } static String sayHelloAgain(){ 'hello again' //***No coverage shown by Clover*** } } {code} Can anyone confirm this? Thanks. ",8 CLOV-1196,"Add testSources parameter for clover2:clover mojo","The Ant task has an optional nested parameter where user can specify an Ant path that Clover should use when looking for source files. Thanks to this, it is possible to generate report using sources from a different location (on a different machine, for instance). Such option is missing for Maven clover2:clover MOJO. The workaround which can be used is to create a custom report descriptor, as described on https://confluence.atlassian.com/display/CLOVER/Creating+custom+reports, which is not convenient actually. Fix: add parameter for clover2:clover MOJO.",1 CLOV-1197,"Perform migration of CLMVN and CLMVNONE from studio.plugins.atlassian.com","The site studio.plugins.atlassian.com is deprecated. All new projects shall be migrated to bitbucket.org or eventually to ecosystem.atlassian.net. *Deadline:* * final deadline 5.03.2013 * it's recommended to finish it before 5.02.2013 *Scope:* -1) Migrate SVN repositories- * https://studio.plugins.atlassian.com/svn/CLMVN * https://studio.plugins.atlassian.com/svn/CLMVNONE -to Mercurial on Bitbucket- -2) Migrate Bamboo builds (if necessary) from- * https://studio.plugins.atlassian.com/builds/browse/CLMVN-TRUNK -Note: CLMVNONE has no builds configured- -to new Bamboo location.- -3) There is no need to migrate Wiki pages and Code reviews (practically empty).- -4) Migrate JIRA issues from- * https://studio.plugins.atlassian.com/browse/CLMVNONE * https://studio.plugins.atlassian.com/browse/CLMVN -to- * https://jira.atlassian.com/browse/CLOV -if this is feasible and set component ""Maven 1 Plugin"" and ""Maven Plugin"", respectively.- -Alternatively, create new issue trackers on Bitbucket or Ecosystem, copy all issues ""as is"" and set projects read-only with a message that issue tracking shall be done in JAC CLOV project.- -5) Update build scripts (Maven / Ant) and handle:- * -new repository type (tagging)- * -new way of deployment of binaries (optional)- -Update also BEAC builds.- ",3 CLOV-1202,"Compile maven-clover2-plugin using JDK1.5","Currently we have two executions of maven-compiler-plugin: * one with source/target=1.3 for src/main * one with source/target=1.5 for src/test Use source/target=1.5 for the whole module. ",1 CLOV-1203,"Update Supported-Platforms page","On http://confluence.atlassian.com/display/CLOVER/Supported+Platforms: * set JRE/JDK = 1.5 or later * add footnote that support for JDK 1.5 has ended with 3.1.x ",1 CLOV-1204,"Remove retrotranslator","Remove all retrotranslator stuff: * jar files (several extlib locations) * build.xml and upgrade.xml files * about boxes in Eclipse and IDEA * etc/rights license files ",1 CLOV-1205,"CLMVNONE new property: maven.clover.instrumentationLevel","Moved from https://studio.plugins.atlassian.com/browse/CLMVNONE-14 This should only be set to 'method' if used in conjunction with Test Optimization if the default level (statement) is not performant enough. Valid values are ""statement"" and ""method"".",1 CLOV-1206,"CLMVNONE Use includes, instead of nested include to allow more than one pattern when merging","Moved from https://studio.plugins.atlassian.com/browse/CLMVNONE-9 For Maven1 plugin: It would be better to change the following code in the clover:merge goal from: {noformat} {noformat} to: {noformat} {noformat} ",1 CLOV-1207,"CLMVNONE Integrate Distributed coverage","Moved from https://studio.plugins.atlassian.com/browse/CLMVNONE-13 Integrate Distributed coverage with Clover-Maven1-Plugin ",3 CLOV-1208,"Show warning if new update is out of scope of the current license","Case: * user has a valid license key with a certain end-of-maintenance date * new Clover version is released but the release date is later than maintenance end * IDEA / Eclipse gives user an ability to upgrade but * after upgrading user cannot use Clover anymore (!) Improvement: * check end-of-maintenance date from current license key, if it is < than release date of the upgrade we want to download, put additional warning about it the the upgrade dialog box",1 CLOV-1209,"Auto update version check reports new version when version strings are identical","Under File > Settings > IDE Settings: Clover > Auto Update, when you press ""Check now"" a window pops up saying: ""New version available: 3.1.10.v20130108000000, you have 3.1.10.v20130108000000 Would you like to upgrade?"" ",3 CLOV-1227,"Add element for and ","Enhance Ant tasks by adding new sub-types and attributes: {code:xml} {code} coverageRecorder * fixed - default value as now, fixed-size coverage recorder requiring presence of clover.db to read the size * growable - like for Android, no need to have clover.db * shared - for Grails app, not only with dynamic size, but also reusing the same instance of recorder if initstring is the same Parse it on Ant level, pass it to InstrumentationConfig and Instrumenter. ",2 CLOV-1228,"Document element on CAC","Write documentation for: * http://confluence.atlassian.com/display/CLOVER/clover-setup * http://confluence.atlassian.com/display/CLOVER/clover-instr * https://confluence.atlassian.com/display/CLOVER/Advanced+setup+configuration ",1 CLOV-1229,"Add profiles for InstrumentationConfig",NULL,1 CLOV-1230,"Embed clover profile array in instrumented classes","Enhance existing instrumentation and embed an array of CloverProfile in instrumented sources/classes, pass this array to Clover.getRecorder(). Java: source based instrumentation RecorderInstrEmitter + Clover.getRecorder() - add static field for _CLR class of *CloverProfile[]* type Groovy: byte code instrumentation - instantiate new CloverProfile[] { new CloverProfile(), ... } array at getRecorder() call ",5 CLOV-1231,"Use GrowableBitSet for PerTestRecorder.One","In PerTestRecorder.One - wrap 'coverage' and coverageShortcut into a helper class (x) set() method - if index is out of bounds then it shall resize 'coverage' BitSet and 'coverageShortcut' array (/) refactor PerTestRecorder.Any, None, One, Many to top-level classes (/) refactor ThreadVisibilityStrategy to top-level class (/) write unit tests for (/) ThreadVisibilityStrategy.SingleThreaded ThreadVisibilityStrategy.Synchronized ThreadVisibilityStrategy.Volatile ",3 CLOV-1232,"Create GrowableBitSet class","extend CloverBitSet, add() method shall check index vs size() and call growToInclude(); make it thread-safe - check how antlr.collections.impl.BitSet.growToInclude() is implemented ",2 CLOV-1235,"Dynamically select coverage recorder based on clover.profile","Clover.getRecorder(): Read -clover.profile system property and if securityexcetion or null then fallback to ""default"". If list of profiles is empty or given profile name was not found, fallback to fixed coverage recorder. Should read coverageRecorder value and instantiate proper recorder type Should fetch from cache using one of: recorderKey = initString + """" + dbVersion + """" + cfgbits; recorderKey = initString; Add debug log messages for actions taken. Prepare necessary tests for java and groovy (assert on log messages). ",2 CLOV-1236,"Add 'clover.enabled' system property","If set to 'false' it should disable recording of the coverage data at runtime.",1 CLOV-1237,"as a developer I'd like not to deploy clover.jar to app server","*Embed clover-runtime.jar into created JAR/WAR/EAR* *Problem:* Instrumenting code by Clover is not enough, user has to manually add clover.jar to the runtime classpath. Otherwise it gets ""ClassNotFoundException com_cenqua_clover/CoverageRecorder"" error. There are over 6'000 views on answers.atlassian.com about this problem (it's #1 on the list) *Solution:* Create a possiblity to automatically or manually embed clover-runtime.jar into produced JAR/WAR/EAR artifacts. *Tasks:* 1) (/) Restructure Clover modules and find exact set of runtime classes, create clover-runtime.jar artifact out of it (will be published on Maven Central). Such subset was already found for Clover-for-Android, but it does not have classes for Distributed Coverage feature. See linked issue. 2) Create Ant task like which will allow to manually put runtime classes into it. 3) Check if it would be possible to intercept all calls as well and do it automatically. Add option to disable this automatic integration and/or to specify regular expression pattern which jars shall be enhanced. 4) Create Maven goal like clover2:embed-runtime-jar with property. 5) Check how to automatically embed Clover runtime classes. Possibilities: * extract clover-runtime.jar into target/classes or target/classes-clover * scan build reactor, intercept packaging tasks like maven-ear-plugin, maven-jar-plugin, maven-rar-plugin, maven-war-plugin, maven-assembly-plugin * modify maven project at runtime and add clover:clover-runtime dependency 6) Eclipse integration - we already have -Xbootclasspath for ""Run with Clover as..."" but it's not enough if user has web application for example. Extract clover-runtime.jar into project's build folder so that other packaging tools could automatically pick these classes. Add pre-build or post-clean event handler to make sure that these classes will be still present after rebuild. Add some option in Window > Preferences or Project > Properties for this. 7) IDEA integration - put these classes into out/production and out/test. Add option in File > Settings > Project Settings or File > Settings > IDE Settings for this. 8) Grails integration - t.b.d.",40 CLOV-1238,"Split clover-core into clover-runtime + clover-core","1) Use class dependency analyzer. Check for classes loaded via reflections too!!! (/) _class dependency analyzer was also used to strip third party libraries from unused classes_ 2) Move runtime classes to clover-runtime module. (/) 3) -Rename packages to com.atlassian.clover.runtime.* but keep few core classes in com_atlassian_clover. Reason: Clover-for-Ant will still have single clover.jar probably and it will use FileInputStream(clover.jar) to dynamically extract classes form archive so we must be able to distinguish them.- (/) _cancelled; too many changes in referenced classes and runtime still ""borrows"" few classes from core_ 4) Enhance build script to publish this as com.atlassian.clover:clover-runtime artefact on Atlassian Central and Maven Central. (/) Note: - for backward compatibility clover-core shall still contain runtime classes and it's name will not change (com.atlassian.clover:clover) (/) - -we can add dependency to clover-runtime in pom.xml, however - just to keep programmers informed about this change- (/) _dependency not added as clover-core already bundles the clover-runtime_ 5) Update documentation on CAC and inform that new, small artifact is available since version 4.0.x. (/) _done_ 6) Update UML in clover-maven-module-structure.graphml (/) _done_ 7) Test it with Clover-for-Android (original clover-core exceeds method limit in Dalvik image) (/) _couldn't test as Android Studio uses Gradle now and is based on IDEA not Eclipse_",5 CLOV-1239,"Create task","Create Ant task: {noformat} {noformat} which will put all Clover's runtime classes into targetFile. Unzip all com_cenqua_clover.* and com.atlassian.clover.runtime.* classes from clover.jar archive which is currently on a classpath (we've got a trick how to find it - see searching for clover.license) into a temporary directory and next put them into jar (use Ant task for this or handle zip directly).",3 CLOV-1240,"Create clover2:embed-runtime-jar goal","Create MOJO for: {noformat} clover2:embed-runtime-jar {noformat} which will read the property and do the same what Ant task does. Difference: we might use maven-assembly-plugin and download clover-runtime artifact for this.",3 CLOV-1241,"Maven extracts clover-runtime into target/classes or target/classes-clover","Automatic integration for unknown plug-ins: extract clover-runtime artifact into current build folder (target/classes for clover2:setup and target/classes-clover for clover2:instrument). Thanks to this these runtime classes might be automatically picked up and packaged. Check if there is any Maven's build property holding list of classes which have to be updated. Add configuration option for this, like: {noformat} extractCloverRuntimeIntoTargetClasses=true {noformat} ",3 CLOV-1242,"Maven: intercept maven-jar-plugin and add clover-runtime","Check if it would be possible to define some Maven property for maven-jar-plugin which would allow to define directory or list of files to be added to the archive. If yes, then extract clover-runtime into e.g. target/clover/runtime (note: it shall not interfere with CLOV-1241 somehow) and pass it to maven-jar-plugin. ",5 CLOV-1243,"Maven: intercept maven-ear-plugin and add clover-runtime","The same as CLOV-1242 but for maven-ear-plugin",3 CLOV-1244,"Maven: intercept maven-rar-plugin and add clover-runtime","The same as CLOV-1242 but for maven-rar-plugin",3 CLOV-1245,"Maven: intercept maven-war-plugin and add clover-runtime","The same as CLOV-1242 but for maven-war-plugin",3 CLOV-1246,"Maven: intercept maven-cargo-plugin and add clover-runtime dependency","The maven-cargo-plugin is the most popular plugin for running in-container tests. Add for clover-runtime there. Add configuration option to have a possibility to disable this.",5 CLOV-1247,"Eclipse: extract clover-runtime classes into build directory","Extract clover-runtime.jar into project's build folder so that other packaging tools could automatically pick these classes. Add pre-build or post-clean event handler to make sure that these classes will be still present after rebuild. Add some option in Window > Preferences or Project > Properties for this.",5 CLOV-1248,"IDEA: extract clover-runtime classes into build directories","IDEA integration - put these classes into: * out/production and * out/test. Add option in File > Settings > Project Settings or File > Settings > IDE Settings for this.",5 CLOV-1249,"Grails: extract clover-runtime into build directory","Usually it's here: \.grails\X.Y.Z\projects\\classes",8 CLOV-1250,"Prepare integration tests for GrowableCoverageRecorder","Integration tests like: * GrowableCoverageRecorder on a large code base * GrowableCoverageRecorder with different strategies ** PerTestRecorder.One / Many / None ** ThreadVisibilityStrategy.SingleThreaded / Volatile / Synchronized => especially check if/how per-test code coverage is affected by multithreaded tests of multithreaded application * GrowableCoverageRecorder with DistributedCoverage ",5 CLOV-1251,"Prepare integration tests for SharedCoverageRecorder","Integration tests like (all with partial global and per-test coverage): * SharedCoverageRecorder with single InstrumentationSession and many classes * SharedCoverageRecorder with multiple InstrumentationSessions, classes from sessions running together * SharedCoverageRecorder with multiple clover databases (different initstrings) * SharedCoverageRecorder with the same class compiled multiple times, different versions are running with coverage measurement, ",5 CLOV-1253,"Some of per-test recording strategies do not work for multi-threaded applications","*Introduction* We've got five per-test recording strategies: * Diffing - clover.pertest.coverage=diff * Null - clover.pertest.coverage=off * SingleThreaded - clover.pertest.coverage= and clover.pertestcoverage.threading= - DEFAULT POLICY * Synchronized clover.pertest.coverage= and clover.pertestcoverage.threading=synchronized * Volatile - clover.pertest.coverage= and clover.pertestcoverage.threading=volatile *Current status* 1) A SingleThreaded does not work with multi-threaded apps. Of course it's designed for single thread only. But at least it should have a correct value of coverage for a test case from a current thread. Expected number of hit counts is between: {noformat} hits(current test) <= ... <= hits(curent test + all other concurrent tests) {noformat} but currently actualHits can be < than hits(current test) due to fact that CloverBitSet.set\(n\) is not thread-safe. 2) A Volatile strategy has a similar problem. CloverBitSet.set\(n\) is not thread safe. Starting/ending of test slices works fine. 3) A Synchronized is correct because we've got 'CloverBitSet.set\(n\)' wrapped in a synchronized block. Starting/ending of test slices works fine. 4) A Diffing needs more tests. *Possible fix* CloverBitSet could have two variants: * compact - store hits as bit mask in long[] array - set\(n\) is not thread-safe, can be used for report generation as it consumes less memory * exploded - store hits as boolean[] array - set\(n\) \{ arr[n] = true \} would be thread-safe, used for runtime recording; it consumes 8x more memory but on the other hand we usually don't have 10'000 tests running in parallel; number of parallel tests is ~ number of processor cores available ",5 CLOV-1254,"Add Ant dependendency to com.cenqua.clover:clover maven artifact","Problem occurs in Gradle framework. When developer declares dependency to Clover artefact and tries to instrument project with Clover, it fails with a not-very-informative error: {noformat} [clover-setup] Detected groovyc compiler org.codehaus.groovy.ant.Groovyc [groovyc] Compiling 1 source file to ....... [groovyc] ERROR: Clover-for-Groovy encountered an error while loading config: {noformat} Debug logging reveals more information: {noformat} [groovyc] ERROR: Clover-for-Groovy encountered an error while loading config: Clover-for-Groovy encountered an error while loading config: : org/apache/tools/ant/BuildException [groovyc] java.lang.NoClassDefFoundError: org/apache/tools/ant/BuildException [groovyc] java.lang.Class.getDeclaredFields0(Native Method) [groovyc] java.lang.Class.privateGetDeclaredFields(Unknown Source) ... [groovyc] com.atlassian.clover.instr.java.InstrumentationConfig.loadFromStream(InstrumentationConfig.java:439) [groovyc] com.atlassian.clover.instr.groovy.Grover.newConfigFromResource(Grover.java:241) [groovyc] com.atlassian.clover.instr.groovy.Grover.(Grover.java:210) {noformat} A reason is that normally this code is being called from Ant so the ant.jar is provided. In Gradle it's not available by default. Workaround: add ant.jar dependency in the project build file. ",4 CLOV-1255,"Prepare code example for Grails","Prepare sample Grails project with domain classes, controllers and unit tests which will use the 'shared' coverage recorder.",2 CLOV-1257,"Add clover.coverageRecorder field for Clover-for-Grails plugin","*A follow-up of CLOV-1189:* Support the coverageRecorder natively in the plugin config. It would be nice to go back to using the simpler configuration instead of the setuptask/reporttask closures. Like: {noformat} clover { coverageRecorder: 'SHARED' } {noformat} *Implementation:* If coverageRecorder field is defined, then create a single profile named ""default"" with coverageRecorder as specified and undefined distributedCoverage. In case clover.setuptask is specified, then settings from this closure will override clover.coverageRecorder value. ",3 CLOV-1258,"Upgrade third party libraries used by Clover","Upgrade third party libraries to their latest versions: * jebrains annotations 13.0 (/) * ASM 5.0 (/) we're using ASM 3.0, 4.1 and 5.0 actually (for different purposes) * commons-codec 1.9 (/) * commons-collections 3.2.1 (/) * commons-lang 2.6 (/) * guava 18.0 (/) * JCommon 1.0.23 (/) * JFreeChart 1.0.19 (/) * Log4J 1.2.17 (/) * Velocity 1.7 (/) ",8 CLOV-1259,"Reduce friction in tutorial","Make Clover evaluation easier by simplifying the tutorial. The build.xml shall contain full Clover set-up so that just typing ""ant"" shall produce all reports. So swap build.xml <-> build_completed.xml, fix ""test"" target name, add default=""clover.all"" etc. Futhermore, Ant and Maven configuration in tutorial shall be unified - use 'target' directory for both of them. Get rid of clutter like 'clover', '.clover', 'build' directories. Update tutorial page on CAC. Consider adding groovy-all-1.7.0.jar into /lib directory so that user won't need to define GROOVY_HOME path.",5 CLOV-1260,"Add url for 'utils.js' home page","In Clover-for-Eclipse and Clover-for-IDEA ""About"" dialogs the Utils.js link does not open the library home page. ",2 CLOV-1261,"PDF report with ""include failed test coverage"" option fails","Eclipse Install Clover-for-Eclipse, open tutorial project, select Run new report > PDF report > select ""Include failed test coverage"" > click Finish. PDF report generation fails with error log message: ""The JVM report process failed with error code 1 - see log for details"" !pdf_fail.png! Increasing heap size from 512M to 768M solved the problem. To do: check why such small project requires so much memory. Check also PDFReporter, Clover-for-IDEA.",2 CLOV-1262,"IDEA Darcula theme ignores ","Clover's ""About"" dialog looks ugly when the ""Darcula"" theme is selected in IDEA 12. Despite having
in JEditorPane(""text/html""), it shows table with a border. Example: !clover_about_idea12_themes.png!",3 CLOV-1263,"Race condition in IDEA during full rebuild and test execution","Clover-for-IDEA. Race condition during database cleanup and running unit tests at the same time. Steps to reproduce; 1. Open ""Moneybags"" tutorial project 2. Prepare 'run all unit tests' configuration 3. Click ""Delete Coverage Database"" button in the ""Cloverage"" view 4. Click ""Rebuild now"" in the prompt dialog 5. Quickly click ""Run (Shift+F9)"" Problem: Project is being rebuilt and clover.db is recreated, at the same time unit tests are compiled and also clover.db is being modified. There's a warning in console log like this: {noformat} WARN: CLOVER: Clover database: 'C:\Work\release\testing-sandbox\clover-ant-3.1.11\tutorial\.clover\coverage.db' is no longer valid. Min required size for currently loading class: 172, actual size: 96 WARN: CLOVER: Coverage data for some classes will not be gathered. Tests taking too long? Try Clover's test optimization. 2 test classes found in package '' {noformat} ",8 CLOV-1264,"Performance problem with SHARED coverage recorder in Grails app","Follow up of CLOV-1189. {noformat} setuptask = { ant, binding, plugin -> ant.'clover-setup'(initstring: "".clover/common.db"") { ant.fileset(dir: ""grails-app"", includes: ""**/domain/**, **/controllers/**, **/jobs/**, **/services/**, **/taglib/**, **/utils/**"") { } ant.fileset(dir: ""src"", includes: ""**/*.groovy, **/*.java"", excludes: ""**/script@*.groovy, **/system/generator/**, **/system/database/generators/**, **/castor/**"") { } ant.fileset(dir: ""test"", includes: ""**/*.groovy"") { } // ant.testsources(dir: ""test"", enabled: false) { } ant.profiles { ant.profile(name: ""default"", coverageRecorder: ""SHARED"") } } } {noformat} If I uncomment the testsources enabled:false line, it runs about as quickly as before. Normally our coverage run takes about 42 minutes. With the above configuration it's been running for about 3 hours and is about half finished.",5 CLOV-1265,"as a developer I'd like to track build events in IDEA12 external build","*Prepare empty plugin for external build.* analyze external build API, prepare a simple plugin which will log compilation progress (module name, file name being compiled) and send notifications about it to IDE; it should also notify about ""compilation finished"" event.",5 CLOV-1266,"Check how clover.db can be accessed from build server and IDE processes at once","probably there are two possible ways to interact with build server process and the IDEA IDE process: 1) build server performs (parallel) instrumentation in memory and at the end of the whole build writes or updates clover.db (it has write access); next it sends notification to IDE which refreshes views and editors; potential problems: deletion of database during build, locking files 2) build server performs (parallel) instrumentation sending information about code structure back to IDEA IDE, which manages the database and sends back indexes of elements; potential problems: high messaging overhead -> need to send at most one message per file -> need to introduce local offset constant per each file;",13 CLOV-1267,"Check how parallel instrumentation can be handled","External build supports parallel compilation. Modules are built in parallel, while files in a single module are compiled sequentially. Clover expects that at least a single file is instrumented sequentially (the FileInto getCoverageMask which returns bitmask based on index range), so that the clover database contains continuous range of indexes for code elements from a single file. It means that we need to synchronize per file. It should not be a problem that subsequent files in database are from different modules. possible solutions: 1) simple lock per whole file in some synchronized block; drawback: turns parallel build into single-threaded one. 2) batch operations, like first instrument whole file using relative indexes, next lock database and store information about whole file, database would return base offset value; still in sychronized block but locked for shorter amount of time; 3) change clover.db structure so that elements could be registered in any order; change FileInfo getCoverageMask function (and related); check for any data structures which needs to be made thread-safe; ",8 CLOV-1268,"Implement clover.db sharing between build server and IDE processes","Based on analysis",13 CLOV-1269,"Implement parallel compilation handling","Based on analysis of CLOV-1267",13 CLOV-1270,"Write sequential integration tests for build server","Prepare integration tests for external build feature. Test the scenario when 'parallel compilation' for 'external build' is disabled. Check if any helper test classes for it are available in IDEA code based. ",13 CLOV-1271,"Test IDEA IDE - build server interaction","Exploratory tests in user interface.",5 CLOV-1273,"Reduce coverage requirements for groovy safe operator","Currently any usage of the groovy safe operator requires that that reference be tested with a null and non-null value. This adds significant overhead in the case where multiple calls are chained together with the safe operator. It would be more useful as a coverage measurement if the chain was treated as one call. Look at the following line as an example. def value = a.getB()?.getC()?.getD()?.getE() This line of code should require a test that sets value to null and a test that sets value to something non-null. It should not however require a test where B is null a test where c is null a test where d is null and a test where e is null to reach 100% conditional coverage. While I hope that lines that look like the above are not written very often, it still could happen, and having to write a bunch of tests to cover one line seems like a heavy burden. ",8 CLOV-1279,"Document how to configure Clover + Bamboo with 'mvn deploy' goal on CAC","The problem is that if 'mvn deploy' is used with Clover, it will deploy instrumented JARs into repository. There's no documentation on confluence.atlassian.com in the BAMBOO space how such separation can be achieved. Create a page with a description like: If you use ""Automatically integrate Clover into this build"" option, then Bamboo will add clover2:setup + clover2:clover goals into every Maven task found in the Job (more details can be found here). It means that you shall not use ""mvn deploy"" together with automatic Clover integration. There are at least three ways to solve this problem: 1) Create a separate Plan (or Job) in which automatic Clover integration is enabled and the Maven 2.x task does not deploy artifacts (""mvn verify"" is used for instance). So this plan would be used only for Clover reporting. Benefits: full Clover separation from the Plan (or Job) performing deployment Drawbacks: doubled Plan (or Job) or 2) Use manual Clover integration (""Clover is already integrated into this build"") but run Clover in a parallel build lifecycle. It means that you'd have to configure Clover goals manually in the pom.xml and use the ""clover2:instrument"" instead of ""clover2:setup"". You could have then just one Maven task with ""mvn clean deploy"". Instrumented jars would have -clover.jar suffix. Benefits: build is executed only once Drawbacks: sometimes there might be problems with resolving correct (""cloverized"") dependent artifacts for multi-module projects or deploying the instrumented war to test server or 3) Use manual Clover integration, but run Clover in a default build lifecycle. It means that you'd have to configure Maven task manually and use ""clover2:setup"" goal. Then you have to use two Maven tasks - one with ""... clover2:setup test ..."" and one with ""deploy"". This is an approach you have followed (according to screenshots I see in attached pdf). Benefits: no problems with artifact dependencies Drawbacks: two Maven tasks Recommendation: approach #3. Steps for approach #3: clean clover2:setup test clover2:aggregate clover2:clover b) define ""Clover Report"" artifact On the 'Artifacts' tab, click Create Definition and complete the form as follows: Name This should begin with with ""Clover Report"". Location This should point to the HTML report directory (e.g. target/site/clover) Copy Pattern Use **/*.* More details on https://confluence.atlassian.com/display/BAMBOO/Enabling+the+Clover+add-on#EnablingtheCloveradd-on-ManualCloverintegration ",1 CLOV-1280,"Error when trying to Check for an Update","I just recently upgraded from IntelliJ IDEA 10.5.4 to 12.1.1 and now 12.1.2. I think my last update to Clover was BEFORE I updated IDEA versions.",5 CLOV-1281,"Improve message for NoSuchRegistryException","See https://confluence.atlassian.com/x/AIP3F A message ""Clover registry file: does not exist."" is too general and does not help developer to understand what the exact problem is. Find a more meaningful message. ",1 CLOV-1285,"Write parallel integration tests for build server","Create IT for external build process with a parallel compilation enabled.",13 CLOV-1286,"as a developer I'd like to build projects using 'classic' build in IDEA12","Make sure that new 'external build' feature support does not break the old build functionality when the compilation is performed in IDEA IDE process. It shall still use JavaSourceTransformingCompiler class, old Project structure, event handling etc. ",13 CLOV-1287,"Code instrumentation using jps-builders","scope: * java code instrumentation * statement/method contexts * test detection ",20 CLOV-1288,"Implement communication between IDEA IDE and JPS builder"," * notifications about build events, progress, error handling * model refreshes",13 CLOV-1289,"Support custom metrics in PDF report","Currently the PDF report does not handle element so it's not possible to have a custom set of metrics in the summary. ",5 CLOV-1291,"PDF report with class-level and method-level summary","The PDF report contains package-level coverage table. Add an option for: * Ant task * clover2:clover mojo * 'generate report' button in Eclipse * 'generate report' button in IDEA which would allow user to select report detail level: * package (default) * class * method for PDF file format. ",8 CLOV-1292,"Check how parallel instrumentation sessions can be handled","External build will start/close single instrumentation session in which modules will be compiled in parallel (see CLOV-1267). However, a parallel build in ant/maven might involve starting multiple instrumentation sessions at once (just think about + in Ant for instance). Check how we could deal with this. Possible problems: * clover.db file locking (appending instrumentation session) Areas for prototyping: * clover db shared in memory * clover db structure change - adding top-level index for sessions/files/classes etc, possibility to interleave data from several instrumentation sessions * etc ...",13 CLOV-1294,"Implement Clover data serialization from IDE to JPS","The following data must be serialized and passed to JPS builder: * global configuration - other.xml (license key, sid, install date) * project settings - .ipr (flush policy, initstring etc ...) * module settings - .iml (exluding entire module from instrumentation) * idea test detector (default test detector + all test source folders) * state of some buttons in UI (FeatureManager) (e.g. 'toggle build with clover')",20 CLOV-1295,"Prepare documentation on CAC and AAC","On Clover-for-IDEA pages: * screenshot with ""Compiler"" settings page from IDEA ** external build can be enabled ** incremental build shall be disabled (recommended) ** parallel build must be disabled (refer to future story) On supported platforms page: * info that IDEA12.0-12.1 + Clover 3.1.8-3.1.11 must have 'external build' disabled Release notes about this new nice feature Update quiestion on AAC",3 CLOV-1297,"HTML report shows only one test result per file if external XML JUnit files are used","In the we can define element which causes that test results are being read from JUnit-compatible XML files, instead of from Clover's coverage recording files. This works as long as the test name can be mapped to the method name (which is usually the case). However, in case of the Spock framework, test cases are named using a free text like: {noformat} def ""check if this test does xyz"" {noformat} which is later translated to a method named like: {noformat} $spock_feature_0_0 {noformat} As a consequence Clover is not able to match test name to the method name (in order to link to sources). It uses an empty test id to store the test result (SLICE_ID = -1). If there are more than one non-matched method in the same XML file, all get the same ID=-1, thus overwriting each other in hashmap. As a consequence only one is listed. *Fix:* Generate a unique test id using the test name - a String.hashCode() for instance. ",5 CLOV-1298,"Contributed and unique coverage are equal","Possible bug. Investigate why these values are identical for MoneyBags tutorial. !unique_and_contributed_coverage.png!",3 CLOV-1299,"Find workaround or fix for IDEA-108852","See http://youtrack.jetbrains.com/issue/IDEA-108852",8 CLOV-1301,"Add more values for a 'threads' drop-down in report dialog","The 'Generate Report' dialog has max 4 threads: !report_generation_threads.png! In age of multi-core multi-threaded processors, we shall have it up to 16 at least. ",2 CLOV-1302,"The 'include line info' toggle works in the opposite way","This toggle !include_line_info.png! works exactly opposite: when selected, the XML report does NOT contain tags; and vice versa.",2 CLOV-1303,"Exclusion icon decoration is not visible in IDEA","Affects IDEA versions 10.5.x-12.1.x (works under IDEA 9.0.x). The toggle 'Annotate icons on included/excluded files ...' does not work: !icon_decoration_do_not_work.png!",5 CLOV-1326,"Class loader fails on clover.jar package-info","Occurs in Bamboo, for instance. {noformat} 2013-07-15 12:16:10,250 ERROR [http-9087-Processor12] [[default]] Servlet.service() for servlet default threw exception java.lang.ClassFormatError: Illegal class name ""com/google/common/collect/package-info"" in class file com/google/common/collect/package-info at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1876) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:889) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1353) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1232) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:249) at java.lang.Package.getPackageInfo(Package.java:352) at java.lang.Package.getAnnotation(Package.java:367) at org.codehaus.jackson.xc.JaxbAnnotationIntrospector.findAnnotation(JaxbAnnotationIntrospector.java:885) at org.codehaus.jackson.xc.JaxbAnnotationIntrospector.findAccessType(JaxbAnnotationIntrospector.java:265) at org.codehaus.jackson.xc.JaxbAnnotationIntrospector.findAutoDetectVisibility(JaxbAnnotationIntrospector.java:216) at org.codehaus.jackson.map.AnnotationIntrospector$Pair.findAutoDetectVisibility(AnnotationIntrospector.java:1018) {noformat} ",3 CLOV-1328,"as a Clover developer I'd like to use the latest version of ANTLR","Clover uses ANTLR 2.x currently which is few light-years from the latest version, which is ANTLR 4.x. Upgrade to the latest ANTLR library version. * check ANTLR 4.x license (it's different from 2.x) whether we can actually use it; if not - try to use 3.x, if possible * check if there's any Java grammar (the best for Java 8) available for Antlr 4 * estimate whether it's better to use completely new grammar file and embed clover stuff there or to upgrade our existing grammar file from 2.x to 4.x ** watch out for our custom extensions like unicode escape sequence handling, annotations etc",13 CLOV-1333,"as a developer I'd like to instrument Java8 new language features","This is an enhancement of CLOV-1139. Clover should be able not only to parse Java8 syntax without error, but also be able to add it's own code statements in order to measure code coverage for: * lambda expressions * ??? Scope: * instrumentation (java.g file) Out of scope: * database format * reporting",20 CLOV-1335,"as a developer I'd like to generate reports with Java8 sources","New language features might require enhancements of existing reports. Evaluate how to represent lambdas - for instance: - as a separate entity in the report, like a class or a method - as an integral part of enclosing scope - similarly as the inline class is being handled by Clover Scope: * HTML, XML, JSON, PDF reports ",13 CLOV-1336,"as a developer I'd like to have information about lambdas in the Clover database","1) Evaluate how to represent Java8 lambdas - for instance: - as a separate entity in the model, like a class or a method - as an integral part of enclosing scope - similarly as the inline class is being handled by Clover 2) Design the DB format having in mind a future extensibility (like functions, functions-in-functions, global variables etc) for other JVM-based languages (like Scala or Closure) 3) Implement it. Scope: * database format Out of scope: * source code instrumentation ",20 CLOV-1337,"as a developer I want be able to select 1.8 language level","The ""1.8"" language level shall be available for: * Ant tasks * clover2:setup clover2:instrument goal * project settings in Clover-for-Eclipse, Clover-for-IDEA Add such option, if necessary, write unit tests. ",3 CLOV-1338,"Warn if directory selected on Test Classes tab is disabled on Source Files tab","On the ""Project Properties > Clover > Source Files"" tab user can select which source folders shall be instrumented by Clover. By de-selecting the checkbox, the whole source root becomes excluded from instrumentation: !source_files.png! On the ""Test Classes"" files user can select which source roots contain test sources: !test_classes.png! It it possible to have such combination that: * source root is excluded * source root is marked as a test root This can be misleading. Add appropriate warning for it.",3 CLOV-1339,"The does not match constructors","*Problem:* If you declare custom test detector, for instance: {code:xml} {code} Then the test detector does not match constructors. As a consequence, a class like this: {code:java} public class SomeException extends Exception { public SomeException(String s) { super(s); } } {code} will be treated as APPLICATION not as TEST code. *Background reason:* {code:java} public boolean isMethodMatch(SourceContext sourceContext, MethodContext methodContext) { final MethodSignature signature = methodContext.getSignature(); return methodMatches(signature.getName()) && methodAnnotationMatches(signature.getModifiers()) && methodReturnPatternMatches(signature.getReturnType()) && methodTagMatches(signature.getTags()); } public boolean methodReturnPatternMatches(String methodReturnType) { return methodReturnType != null && (methodReturnTypePattern == null || methodReturnTypePattern.matcher(methodReturnType).matches()); } {code} The methodReturnType==null for constructors, thus constructor do not match the pattern. *Solution:* We could rewrite check like this: {code:java} return methodReturnTypePattern == null || (methodReturnType != null && methodReturnTypePattern.matcher(methodReturnType).matches()); {code} However, this would require entirely new handling of code instrumentation for constructors. The reason is that code would be currently rewritten like: {code:java} public SomeException(String s) { __CLR3_1_12_100hjv4vvu6.R.globalSliceStart(getClass().getName(), 0); int $CLV_p$ = 0; java.lang.Throwable $CLV_t$ = null; try { __CLR3_1_12_162c4pt0(s); // <<< ORIGINAL CONSTRUCTOR $CLV_p$ = 1; } catch (java.lang.Throwable $CLV_t2$) { if ($CLV_p$ == 0 && $CLV_t$ == null) { $CLV_t$ = $CLV_t2$; } __CLR3_1_12_100hjv4vvu6.R.rethrow($CLV_t2$); } finally { __CLR3_1_12_100hjv4vvu6.R.globalSliceEnd(getClass().getName(), ""SomeException.SomeException"", 0, $CLV_p$, $CLV_t$); } } private __CLR3_1_12_162c4pt0(String s) { // << COMPILATION FAILURE, MISSING RETURN TYPE super(s); __CLR3_1_12_100hjv4vvu6.R.inc(1); __CLR3_1_12_100hjv4vvu6.R.inc(0); } {code} Problems: * call to super() must be first * we should not move constructor body into another method ",20 CLOV-1341,"Implicit return in Groovy switch statement is instrumented incorrectly","*Problem:* Consider the following code: {code:java} def create(boolean b) { switch (b) { case true: new Integer(10) break case false: new String(""abc"") break } } {code} * switch statement is the last statement in function, so it's value is being returned from a function call * new Integer() / new String() are last statements before 'break' which is a function's exit point * thus 10 or ""abc"" are returned Clover instruments code as follows: {code:java} def create(boolean b) { recorder.inc(0); switch (b) { case true: recorder.inc(1); new Integer(10) recorder.inc(2); break case false: recorder.inc(3); new String(""abc"") recorder.inc(4); break } } {code} * as a consequence, the last statement before 'break' becomes recorder.inc(), which returns void; as a result the create() function returns null *Workaround:* Use return instead of break in a switch statement, e.g.: {code:java} case true: return new Integer(10) // no break {code} *Fix:* * do not add recorder.inc() before 'break'; drawback of the solution: we loose tracking of empty breaks, see below. {code:java} def foo(int i) { switch (i) { case 1: recorder.inc(1); println(""one"") /*recorder.inc(2); not added*/ break; case 2: case 3: /*recorder.inc(3); not added*/ break; } } foo(1) foo(2) {code} in the code above it would be nice to have ""case2: case 3: recorder.inc(3); break;"" colored in green, despite that code makes nothing ... ",5 CLOV-1344,"Added LICENSES.html file to Clover artfiacts","Add the LICENSES.html file containing a table with: * name of third party library * link to home page (download sources / binaries) * link to the license file into the following artifacts: * Clover-for-Ant ZIP * Clover-for-Eclipse update site ZIP * Clover-for-IDEA plug-in JAR Note: * there's no need to add such file in the Clover-for-Grails and Clover-for-Maven2&3, because these plug-ins do not contain any third party libraries embedded in it (just references in pom.xml / BuildConfig.groovy) Reason for change: * ensuring that we obey requirements imposed by various open source licences ",3 CLOV-1348,"review navigation links on a page summary","frames/no frames - deleted show help - exists on some of pages overview/package/file - moved to breadcrumbs on a page header todo: discuss with UX designer how breadcrumbs shall show the structure, e.g.: - shall we display report name and a project name only? - or some main section? - or the entire path - if so, shall we have: Report > Project > Test/App/Clouds > Package > FIle/Class > (Test) or something else?",2 CLOV-1350,"Add ADG navigation bar in the HTML report"," * probably should be optional, because we embed reports in Bamboo -> how to handle this? all links from navigation bar shall be available somewhere else? * what to put in the nav bar? we don't have 'create issue' button for sure ;-)",1 CLOV-1352,"Create code samples with java8 syntax","annontations on java types repeating annotations lambdas virtual extension methods",13 CLOV-1353,"Prepare unit tests compiling and instrumenting code samples","test: compile code samples from CLOV-1352 using JDK1.8 javac instrument these code samples using Clover expected: no instrumentation of lambdas yet, just test if files are parsed correctly",13 CLOV-1354,"Set up a Bamboo build for JDK1.8","run all clover tests, including tests of java8 syntax on JDK1.8 on Bamboo",3 CLOV-1355,"Add new grammar rules for java8 syntax","just to correctly parse new syntax, do not add clover instrumentation to these new code constructs something like: lambda : ( lambdaNoArgs | lambdaImplicitTypesArgs | lambdaExplicitTypesArgs ) '->' ( lambdaExpressionLikeStatement | lambdaCodeBlock ) plus extend the method definition and add 'default' keyword as optional; probably won't need to distinguish between method declaration in interface and in a class",3 CLOV-1357,"as an administrator I need to monitor Clover usage on machines","As a system administrator I need to have a way to track down usage of Clover licenses within my organization in order to make sure that Clover is not installed or used on more machines than the license allows to. Currently there is no tool for this purpose and the only indirect way is to scan for clover license files. One of possible solutions: * add the environment variable which will enable tracking of clover license usage, such variable could be set on all machines in users' profiles by system administrator * the variable would point to the URL which will collect data about license usage, e.g.: {noformat} -Dclover.license.usage.url=http://path.to.web.server/clover.php?someoptions {noformat} * whenever code instrumentation or report generation is performed and the environment variable is defined, clover will connect to the specified URL using simple HTTP GET request * it would be up to the system administrator to collect data from such HTTP GET requests (e.g. parsing apache logs, using some php script to store data in database ...) * options of HTTP GET {noformat} ?LicenseID=ABCDEF&LicenseExpiryDate=YYYY-MM-DD&MaintenanceExpiryDate=YYYY-MM-DD&Organisation=CompanyName&NumberOfUsers=NN&LicenseTypeName=DESKTOP_OR_SERVER {noformat} Scope: clover core (would work in ant, maven, grails, eclipse, idea ...)",13 CLOV-1358,"Enhance Clover database to keep full instrumentation history","*Problem:* Currently Clover database keeps list of instrumentation sessions plus information about classes which is a sum of all previous instrumentation sessions in such way that for given class only the latest class version is stored. There are two limitations of current design: 1) Test optimization might not work correctly for some test frameworks for Groovy language. This is due to nature of the Groovy language itself, where compiler allows to compile code which does not have all symbols resolved (they're being resolved at runtime). As a consequence if a dependent application class is changed, this does not to have trigger recompilation of the test class. See comment for more details. 2) Syntax highlighting in HTML report is always based on the latest class version, so if someone has older source file, it can be rendered incorrectly. There's a warning for this in HTML report, but we could fetch the actual line/char indexes from the older class version. *Solution:* 1) Enhance UpdateableRegFile and keep all versions of classes. This should be optional and disabled by default. 2) Enhance RegFile API to allow querying for older versions of given file (by default it should always return the latest version). 3) Add new option for and to allow to keep full instrumentation history. Either as ""true/false"" or as a number (maximum number of versions of the single class to store). 4) Add API to calculate index bitset as a logical OR of bitsets from all versions of the given file or class. ",40 CLOV-1359,"Fix test optimization and check all class versions","Depends on CLOV-1358 Test optimization should scan for hit count indexes of all versions of given class. This is necessary in order to workaround the problem of the groovyc compiler which resolves some of symbols at runtime and thus it does not always recompile test class if application class is not changed. ",13 CLOV-1360,"Analyse how tests are converted by Spock ","Analyse how a test named like: {noformat} def ""my test name"" {noformat} is converted to a method like: {noformat} $spock_feature_1_0 {noformat} It's being done during AST transformation I guess. Check how it's possible to either: * reverse engineer this behaviour i.e. get a back-ward mapping $spock_feature_1_0 -> def ""my test name"" or * reproduce this behaviour, i.e. instrument methods in such order/way that Clover could 'calculate' the same method name ",13 CLOV-1361,"Implement test name to method name mapping in Clover","Based on the investigation results from CLOV-1360 write proper mapping in Clover so that we could keep original names of test cases in Clover database (like ""my test name"" instead of $spock_feature_1). And these tests should properly ""link"" to appropriate sections in source code - for instance in order to allow navigation in HTML report from test result to the test class source code.",13 CLOV-1362,"Add Spock test name patterns in default test detector ","Clover's default test detector should properly recognize Spock-framework test classes and which methods are test ones and which are helper ones. We shall not see stuff like this in the test summary: {noformat} Tests Started Status Time (secs) Message OpsWiseJobQueryTestSpec. 12 mar 10:32:50 PASS 0 // BAD OpsWiseJobQueryTestSpec.$spock_feature_1_0 12 mar 10:32:49 PASS 0,001 // OK, but use original name OpsWiseJobQueryTestSpec. 12 mar 10:32:49 PASS 0 // BAD OpsWiseJobQueryTestSpec.setup 12 mar 10:32:49 PASS 0,009 // BAD {noformat} ",8 CLOV-1363,"Ensure that reports show the test name and not the method name","Make sure that HTML, XML, PDF, JSON reports will display the test name (like ""my test name"" taken from def) rather than the actual name of test method (like $spock_feature). ",8 CLOV-1369,"as a developer I don't need to run Clover on JDK1.5 anymore","*Idea:* Sun Java 1.5 has: * end of public updates - Oct 2009 * end of Premier Support - May 2011 * end of Extended Support - May 2015 * see http://www.oracle.com/technetwork/java/eol-135779.html IBM Java 1.5: * its End Of Servcie (EOS) will expire on September 2015 * see https://www.ibm.com/developerworks/java/jdk/lifecycle/ According to various sources, most popular are Java6 and Java7 with Java8 growing up; Java1.5 has a fraction of market right now: * http://www.statowl.com/java.php although the report above shows Java version in web browser. Production environment may be different (especially regarding IBM Java). *Benefits:* Dropping support for Java 1.5 would improve Clover development, as we could: * use @Override for interfaces * use newer version of Guava (we're on Guava 9 (!) due to required JDK1.5 binary compatibility) * have all Clover modules and plugins on the same JDK level ** Groovy/Grails require JDK6+ to compile and execute ** Clover-for-IDEA (IDEA12 JPS) requires JDK6+ to compile and execute ** rest is on JDK5 *Tasks:* * update Supported-Platforms page * update guava library (and all others which are compiled against jdk6) * update build scripts * affects Clover Core, Clover-for-Ant, Clover-for-Maven2&3, Clover-for-Eclipse, Clover-for-IDEA, Clover-for-Grails *Out of scope:* * adding Override annotations - this will be done gradually during daily development ",5 CLOV-1375,"Extend API for loading and manipulate coverage files ","Clover 3.2.0 published new interfaces describing a database model (com.atlassian.clover.api.registry). We need to reveal more Clover stuff via API in order to make it more usable by other developers. For example: * loading database and coverage files, handling instrumentation sessions * manipulating coverage files",8 CLOV-1376,"Change signature of getXyz() methods in HasXyz interfaces","Current signatures have , for example: {code:java} List getMethods() {code} This works fine for Clover's internal data structures (as there are subclasses), but it's not usable by developers using this API. It should be possible to have an assignment like: {code:java} List methodMetrics = classInfo.getMethods() {code} Fix: change to . Note: We may need to expose additional methods in interface. They could throw Exception(""not implemented"") or return nulls.",5 CLOV-1377,"Create interfaces and factory methods for loading Clover database","*Problem:* Database entities are already in c.a.c.api.registry package. However, in order to load the database you have to call an inner class, for example: {code:java} import com.atlassian.clover.CloverDatabase; // XXX internal class import com.atlassian.clover.CoverageDataSpec; // XXX internal class import com.atlassian.clover.api.registry.ProjectInfo; // ... CloverDatabase db = CloverDatabase.loadWithCoverage(args[0], new CoverageDataSpec()); ProjectInfo projectInfo = db.getRegistry().getProject(); {code} *Fix:* Create proper interfaces and a factory hiding the CoverageDataSpec and CloverDatabase. ",3 CLOV-1378,"Create interfaces and some template class for handling instrumentation sessions","*Problem:* In order to update content of a database and store new instrumentation session a number of internal classes must be used, e.g.: {code:java} import com.atlassian.clover.context.ContextSet; import com.atlassian.clover.registry.Clover2Registry; import com.atlassian.clover.registry.FixedSourceRegion; import com.atlassian.clover.registry.entities.MethodSignature; import com.atlassian.clover.registry.entities.Modifier; import com.atlassian.clover.registry.entities.Modifiers; import com.atlassian.clover.registry.entities.Parameter; // ... registry = Clover2Registry.createOrLoad(dbFile, projectName); session = registry.startInstr(encoding) // ... session.enterMethod(new ContextSet(), new FixedSourceRegion(12, 1), methodSignature, false, false, 5, LanguageConstruct.Builtin.METHOD); {code} *Fix:* - move MethodSignature, Modifier, Modifiers, Parameter to API - create factory for FixedSourceRegion, ContextSet - enterMethod (and others) shall use ContextSet from API ",5 CLOV-1379,"Create API for handling coverage recording files","*Problem:* Currently there's no API which would allow to create a global recording or a per-test recording file. Such API would be useful, e.g. for conversion of coverage data from other tools such as Cobertura or Emma. *Fix:* - publish global and per-test recording file format on CAC (including naming convention for files) - expose class for global coverage file (equivalent of FileBasedGlobalCoverageRecording) - expose class for per-test coverage file (equivalent of FileBasedPerTestRecording) ",8 CLOV-1380,"Create API for handling optimization snapshot","*See:* * [Hacking Clover / Updating optimization snapshot file|https://confluence.atlassian.com/display/CLOVER/Updating+optimization+snapshot+file] * [src/it/optmized/snapshot-hacking|https://bitbucket.org/atlassian/maven-clover2-plugin] *Problem:* Internal classes are used to manipulate snapshot. {code:java} import com.atlassian.clover.registry.entities.TestCaseInfo; import com.atlassian.clover.optimization.Snapshot; // ... Snapshot snapshot = Snapshot.loadFrom(snapshotLocation); final Set allTestCaseInfos = db.getCoverageData().getTests(); for (TestCaseInfo tci : allTestCaseInfos) { ... } snapshot.store(); {code} *Fix:* Create proper interfaces/classes in c.a.c.api.optimization ",8 CLOV-1381,"Add showInnerFunctions and showLambdaFunctions to clover2:setup","Command line tools and a Ant task have these options. Add: showInnerFunctions=false showLambdaFunctions=false to CloverReportMojo. Pass these values to a report descriptor. Define such values also in the default descriptor (clover-report.xml).",1 CLOV-1382,"Add lambda toggle to report wizards in Eclipse and IDEA","Add toggles for showInnerFunctions and showLambdaFunctions in report wizards in Eclipse and IDEA plugins. Toggles shall be visible for HTML and XML reports. Consider using a drop down ""show lambda functions"": - NONE (inner=false, lambda=false) - FIELDS ONLY (inner=false, lambda=true) - FIELDS AND METHODS (inner=true, lambda=true) ",2 CLOV-1384,"Fully qualified java.lang is not used for system properties in Clover.getRecorder ","Generated code: {code:java} R=com_cenqua_clover.Clover.getNullRecorder();_R=com_cenqua_clover.Clover.getNullRecorder();_R=com_cenqua_clover.Clover.getRecorder( ""\u0063....\u0064\u0062"", 1382598086449L,8589935092L,49,profiles, new String[]{""clover.distributed.coverage"",null}); ^^^^^ java.lang. is missing {code} ",2 CLOV-1385,"Perform Scala spike","This task is time-boxed to 5 days. Take a look at: * our Scala prototype * SCCT * Scoverage to learn how instrumentation could be implemented. Expected outcome: * knowledge how scalac works (compilation phases, AST structure, plugging into it) * detailed list of tasks required * task estimation * prioritisation",5 CLOV-1387,"Clover integration with Bamboo - enhancements","*THIS EPIC IS OPTIONAL* There is a number of open issues in Bamboo JIRA project related with a Clover plugin. Sorted by importance (in my opinion): * BAM-13564 (Remove the $\{buildKey\} from Clover plugin URLs) * BAM-12852 (Add Clover tab for Build Summary page) * BAM-13404 (Use BuildConfig's DSL to install Clover plugin) * BAM-13208 (Improve Automatic Clover integration for multi-module maven builds) * BAM-13610 (Facilitate Clover configuration for plans using automatic Clover integration) * BAM-13786 (Test Coverage History drops to zero on days with no tests) * BAM-12118 (Perform cleanup of clover_fs_rez* and grover*jar files) * BAM-13787 (Allow Clover test coverage history duration be customized for the graph) * BAM-11590 (Add job failure based on coverage threshold for Clover plugin) TODO: check which ones could be implemented for this release. ",40 CLOV-1388,"as a developer I'd like to have Spock @Unroll annotation being recognized by Clover","The {noformat}@Unroll{noformat} annotation causes that a test name will be unrolled for every combination of test data. It means that we can have multiple tests having different name, which in fact are related with exactly the same test method, but ran with different input arguments. Examples (from http://docs.spockframework.org/en/latest/data_driven_testing.html): {code:java} // sequence index at the end @Unroll def ""maximum of two numbers""() { ... } maximum of two numbers[0] PASSED maximum of two numbers[1] FAILED // variable substitution @Unroll def ""maximum of #a and #b is #c""() { ... } maximum of 3 and 5 is 5 PASSED maximum of 7 and 0 is 7 FAILED {code} Problem for Clover: we don't know neither a number of tests nor their names during compilation. it would have to be deferred to runtime. => add some inner class for a test class which would monitoring the test name and somehow pass to the per-test coverage recorder? ",20 CLOV-1389,"Instrumentation of a branch condition with a generic type leads to javac compilation error","*For a declaration like this:* {code:java} public T getFeatureValue(); ... if (client.getFeatureValue()) { {code} the instrumented line gets instrumented like: {code:java} _CLR3_1_113f23f2hnz3nmqe.R.inc(5146);if ((((client.getFeatureValue())&&(CLR3_1_113f23f2hnz3nmqe.R.iget(5147)!=0|true))||(_CLR3_1_113f23f2hnz3nmqe.R.iget(5148)==0&false))) {{ {code} which leads to compilation error: {noformat} error: bad operand types for binary operator '&&' {noformat} *Reason:* Javac performs autoboxing of the if condition. However it cannot deal properly if the same generic value is used with && or || operators. It looks like if javac wraps the entire if condition, not a single element. Look at the example: {code:java} public class BranchCoverageWithAutoboxing { interface Data { public T getValue(); } public boolean testGetValue(Data source) { if (source.getValue()) { // Implicit conversion to Boolean via autoboxing return true; } return false; } public boolean testGetValueWithBoolean(Data source) { if (source.getValue() && true) { // Error: Operator && cannot be applied to java.lang.Object, boolean return true; } return false; } public boolean testGetValueWithWrappedBoolean(Data source) { if (Boolean.valueOf(source.getValue().toString()) && true) { // Explicit conversion, compilation is successful return true; } return false; } } {code} *Workaround:* Don't rely on boolean autoboxing and change a generic type to Boolean. or Extract expression being autoboxed to a local variable and evaluate before ""if"". Use the variable in ""if"". {code:java} // original: if (source.getValue) // fixed: Boolean b = source.getValue(); if (b) {code} or surround problematic code block with ""///CLOVER:OFF"" and ""///CLOVER:ON"" inline comments (note that three slashes are used)",13 CLOV-1390,"clover intrumented testcode with PersitenceConstructor and parameters fails ","If the integration tests running without clover instrumentation the test works fine, but with clover instrumentation the one test will fail. {code} org.springframework.data.mapping.model.MappingException: No property null found on entity class com.test.framework.Model.DataModel to bind constructor parameter to! org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:74) org.springframework.data.mapping.model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:63) org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:71) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:232) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:212) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172) org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75) org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1841) org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1492) org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1303) org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:475) org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:470) com.test.framework.DatabaseSpec.search User Query(DatabaseSpec.groovy:52) {code} its seem to be a problem with follow declaration {code} @PersistenceConstructor public DataModel(String username, String password) {code} ",1 CLOV-1392,"as a code reviewer I'd like to see ADG fonts and colours in the HTML report",NULL,40 CLOV-1393,"review ADG page layout in the HTML report","review layouting of various components on the page and an interaction between them",1 CLOV-1395,"IDEA13 compatiblity issues","Compatiblity issues of Clover-for-IDEA with the latest IDEA13: 1) Attempt to load a license key from a file (About Clover box > License button > Load) fails with an error: {noformat} com.intellij.openapi.fileChooser.FileChooser.chooseFiles(Ljava/awt/Component;Lcom/intellij/openapi/fileChooser/FileChooserDescriptor;)[Lcom/intellij/openapi/vfs/VirtualFile;: com.intellij.openapi.fileChooser.FileChooser.chooseFiles(Ljava/awt/Component;Lcom/intellij/openapi/fileChooser/FileChooserDescriptor;)[Lcom/intellij/openapi/vfs/VirtualFile; java.lang.NoSuchMethodError: com.intellij.openapi.fileChooser.FileChooser.chooseFiles(Ljava/awt/Component;Lcom/intellij/openapi/fileChooser/FileChooserDescriptor;)[Lcom/intellij/openapi/vfs/VirtualFile; com.cenqua.clover.idea.config.LicenseConfigPanel.loadLicenseFile(LicenseConfigPanel.java:321) com.cenqua.clover.idea.config.LicenseConfigPanel.actionPerformed(LicenseConfigPanel.java:216) javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) java.awt.Component.processMouseEvent(Component.java:6505) javax.swing.JComponent.processMouseEvent(JComponent.java:3321) java.awt.Component.processEvent(Component.java:6270) java.awt.Container.processEvent(Container.java:2229) java.awt.Component.dispatchEventImpl(Component.java:4861) java.awt.Container.dispatchEventImpl(Container.java:2287) java.awt.Component.dispatchEvent(Component.java:4687) java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) java.awt.Container.dispatchEventImpl(Container.java:2273) java.awt.Window.dispatchEventImpl(Window.java:2719) java.awt.Component.dispatchEvent(Component.java:4687) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) java.awt.EventQueue.access$200(EventQueue.java:103) java.awt.EventQueue$3.run(EventQueue.java:688) java.awt.EventQueue$3.run(EventQueue.java:686) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) java.awt.EventQueue$4.run(EventQueue.java:702) java.awt.EventQueue$4.run(EventQueue.java:700) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.awt.EventQueue.dispatchEvent(EventQueue.java:699) com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:696) com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:520) com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:335) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:154) java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182) java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221) java.security.AccessController.doPrivileged(Native Method) java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219) java.awt.Dialog.show(Dialog.java:1082) com.intellij.openapi.ui.impl.DialogWrapperPeerImpl$MyDialog.show(DialogWrapperPeerImpl.java:786) com.intellij.openapi.ui.impl.DialogWrapperPeerImpl.show(DialogWrapperPeerImpl.java:462) com.intellij.openapi.ui.DialogWrapper.showAndGetOk(DialogWrapper.java:1543) com.intellij.openapi.ui.DialogWrapper.show(DialogWrapper.java:1511) com.intellij.ide.actions.ShowSettingsUtilImpl.a(ShowSettingsUtilImpl.java:263) com.intellij.ide.actions.ShowSettingsUtilImpl.editConfigurable(ShowSettingsUtilImpl.java:228) com.intellij.ide.actions.ShowSettingsUtilImpl.editConfigurable(ShowSettingsUtilImpl.java:213) com.cenqua.clover.idea.AboutDialog$1.actionPerformed(AboutDialog.java:216) javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) java.awt.Component.processMouseEvent(Component.java:6505) javax.swing.JComponent.processMouseEvent(JComponent.java:3321) java.awt.Component.processEvent(Component.java:6270) java.awt.Container.processEvent(Container.java:2229) java.awt.Component.dispatchEventImpl(Component.java:4861) java.awt.Container.dispatchEventImpl(Container.java:2287) java.awt.Component.dispatchEvent(Component.java:4687) java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) java.awt.Container.dispatchEventImpl(Container.java:2273) java.awt.Window.dispatchEventImpl(Window.java:2719) java.awt.Component.dispatchEvent(Component.java:4687) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) java.awt.EventQueue.access$200(EventQueue.java:103) java.awt.EventQueue$3.run(EventQueue.java:688) java.awt.EventQueue$3.run(EventQueue.java:686) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) java.awt.EventQueue$4.run(EventQueue.java:702) java.awt.EventQueue$4.run(EventQueue.java:700) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.awt.EventQueue.dispatchEvent(EventQueue.java:699) com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:696) com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:520) com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:335) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:154) java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182) java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221) java.security.AccessController.doPrivileged(Native Method) java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219) java.awt.Dialog.show(Dialog.java:1082) com.intellij.openapi.ui.impl.DialogWrapperPeerImpl$MyDialog.show(DialogWrapperPeerImpl.java:786) com.intellij.openapi.ui.impl.DialogWrapperPeerImpl.show(DialogWrapperPeerImpl.java:462) com.intellij.openapi.ui.DialogWrapper.showAndGetOk(DialogWrapper.java:1543) com.intellij.openapi.ui.DialogWrapper.show(DialogWrapper.java:1511) com.cenqua.clover.idea.actions.AboutAction.actionPerformed(AboutAction.java:19) com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:162) com.intellij.openapi.actionSystem.impl.ActionButton.a(ActionButton.java:170) com.intellij.openapi.actionSystem.impl.ActionButton.a(ActionButton.java:133) com.intellij.openapi.actionSystem.impl.ActionButton.processMouseEvent(ActionButton.java:311) java.awt.Component.processEvent(Component.java:6270) java.awt.Container.processEvent(Container.java:2229) java.awt.Component.dispatchEventImpl(Component.java:4861) java.awt.Container.dispatchEventImpl(Container.java:2287) java.awt.Component.dispatchEvent(Component.java:4687) java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) java.awt.Container.dispatchEventImpl(Container.java:2273) java.awt.Window.dispatchEventImpl(Window.java:2719) java.awt.Component.dispatchEvent(Component.java:4687) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) java.awt.EventQueue.access$200(EventQueue.java:103) java.awt.EventQueue$3.run(EventQueue.java:688) java.awt.EventQueue$3.run(EventQueue.java:686) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) java.awt.EventQueue$4.run(EventQueue.java:702) java.awt.EventQueue$4.run(EventQueue.java:700) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.awt.EventQueue.dispatchEvent(EventQueue.java:699) com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:696) com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:520) com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:335) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) java.awt.EventDispatchThread.run(EventDispatchThread.java:91) {noformat} 2) Compilation of the project with Clover enabled fails with compilation error ""package com_cenqua_clover"" does not exist. The most probably Clover fails to add clover.jar to project's class path. {noformat} java: package com_cenqua_clover does not exist {noformat} 3) There is no option to enable/disable external build feature. It seems that the ""classic"" build functionality has been removed in IDEA13. ",13 CLOV-1396,"""No such property: testTargetPatterns"" exception with Grails 2.3","Unable to use Clover-for-Grails with Grails 2.3. Build fails with an exception: {noformat} |Environment set to test ................................... [mkdir] Created dir: C:\Work\grails-clover-plugin-hg\testcases\petclinic233\target\test-reports\html . [mkdir] Created dir: C:\Work\grails-clover-plugin-hg\testcases\petclinic233\target\test-reports\plain .Error | Error executing script TestApp: No such property: testTargetPatterns for class: _Events groovy.lang.MissingPropertyException: No such property: testTargetPatterns for class: _Events at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50) at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:231) at _Events$_run_closure3.doCall(_Events.groovy:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1086) at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:910) {noformat} *Reason:* In the Grails 2.3 the _GrailsTest.groovy has been refactored into GrailsProjectTestRunner and GrailsProjectTestCompiler. The testTargetPatterns property has been removed. *Probable fix:* Replace testTargetPattern by iterator over testNames. ",2 CLOV-1397,"Java+Groovy compilation fails with Clover enabled in IntelliJ 12.1.x","When building my project in IntelliJ the build fails with the following exception. I saw a couple other similar comments about how using an external build can cause problems but I thought this was fixed with Clover 3.2? If I turn off the external build then the compilation does succeed. The project is a combined Java/Groovy project if that matters. Let me know if you need any more details. {noformat} Error: java.lang.IllegalArgumentException: org.jetbrains.jps.javac.TransformableJavaFileObject java.lang.RuntimeException: java.lang.IllegalArgumentException: org.jetbrains.jps.javac.TransformableJavaFileObject com.sun.tools.javac.main.Main.compile(Main.java:475) com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:132) org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:167) org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:364) org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:276) org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:190) org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:162) org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1018) org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:742) org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:790) org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:705) org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:526) org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:314) org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:179) org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:129) org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:220) org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:112) org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler$1.run(BuildMain.java:132) org.jetbrains.jps.service.impl.SharedThreadPoolImpl$1.run(SharedThreadPoolImpl.java:41) java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) java.util.concurrent.FutureTask.run(FutureTask.java:262) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:744) Caused by: java.lang.IllegalArgumentException: org.jetbrains.jps.javac.TransformableJavaFileObject com.sun.tools.javac.file.JavacFileManager.inferBinaryName(JavacFileManager.java:660) javax.tools.ForwardingJavaFileManager.inferBinaryName(ForwardingJavaFileManager.java:84) com.sun.tools.javac.api.ClientCodeWrapper$WrappedJavaFileManager.inferBinaryName(ClientCodeWrapper.java:225) com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2524) com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2505) com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:2143) com.sun.tools.javac.code.Symbol.complete(Symbol.java:421) com.sun.tools.javac.comp.Enter.visitTopLevel(Enter.java:298) com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:459) com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258) com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272) com.sun.tools.javac.comp.Enter.complete(Enter.java:484) com.sun.tools.javac.comp.Enter.main(Enter.java:469) com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:929) com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:824) com.sun.tools.javac.main.Main.compile(Main.java:439) ... 23 more {noformat} {panel:title=Problem summary|bgColor=yellow} This bug occurs when all of the following conditions are met: * IDEA 12.1.1 or later is used * Clover 3.1.12 or later is used * an ""external build"" feature is enabled (Settings > Compiler > Use external build) * project has a mixed Java + Groovy code It's an IDEA bug - http://youtrack.jetbrains.com/issue/IDEA-110835 - and has been fixed in IDEA13. Therefore: * in IDEA 12.x - disable the ""external build"" feature * in IDEA 13.x - problem does not occur {panel} ",13 CLOV-1398,"Java 1.8 Exceptions not being propagated correctly","I have the following test stub (src/main/java) {code:java} public final class TestStub { TestStub() { throw new IllegalArgumentException(); } public static void getHandler() { new HashMap<>().computeIfAbsent(String.class, t -> new TestStub()); } } {code} And the following test (src/test/java) {code:java} public class FooTest { @Test(expected = IllegalArgumentException.class) public void test0() { TestStub.getHandler(); } } {code} Using maven It runs fine using ""clean install"" however using clover I get the following exception {noformat} java.lang.reflect.UndeclaredThrowableException com.sun.proxy.$Proxy12.apply(Unknown Source) java.util.HashMap.computeIfAbsent(HashMap.java:1118) org.cakeframework.internal.container.TestStub.getHandler(TestStub.java:26) org.cakeframework.internal.container.FooTest.test0(FooTest.java:29) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19) org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) org.junit.runners.ParentRunner.run(ParentRunner.java:309) org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) Caused by: java.lang.reflect.InvocationTargetException sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) org.cakeframework.internal.container.TestStub$__CLR3_2_0wqwqhpd53be5$1.invoke(TestStub.java:20) ... 28 more Caused by: java.lang.IllegalArgumentException org.cakeframework.internal.container.TestStub.(TestStub.java:22) org.cakeframework.internal.container.TestStub.lambda$getHandler$6(TestStub.java:26) org.cakeframework.internal.container.TestStub$$Lambda$13/1227074340.apply(Unknown Source) ... 33 more {noformat} If I replace with a standard anonymous class implementing java.util.function.Function it runs fine",3 CLOV-1399,"Java 1.8 compilation fails when lambda is passed to a generic argument","The following piece of code fails to be instrumented {code:java} public class Fails { public final Iterable depthFirstTraversal(Class type) { return (Iterable) depthFirstTraversal(e -> type.isInstance(e)); } public final Iterable depthFirstTraversal(Predicate predicate) { return null; } } {code} Javac gives the following error message: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project cake-util: Compilation failure: Compilation failure: [ERROR] /Users/kasperni/workspace/CAKE/cake-util/cake-util/target/clover/src-instrumented/org/cakeframework/internal/util/tree/Fails.java:[27,67] reference to depthFirstTraversal is ambiguous [ERROR] both method depthFirstTraversal(java.lang.Class) in org.cakeframework.internal.util.tree.Fails and method depthFirstTraversal(java.util.function.Predicate) in org.cakeframework.internal.util.tree.Fails match [ERROR] /Users/kasperni/workspace/CAKE/cake-util/cake-util/target/clover/src-instrumented/org/cakeframework/internal/util/tree/Fails.java:[27,86] incompatible types: cannot infer type-variable(s) I,T [ERROR] (argument mismatch; java.lang.Class is not a functional interface) [ERROR] -> [Help 1]",3 CLOV-1401,"Clover fails to instrument generic type with a constructor reference","This works fine: {code:java} myLambda = ArrayList::new; // javac error since JDK8 b114 myLambda = ArrayList::new; {code} But the following: {code:java} myLambda = ArrayList::new; myLambda = ArrayList::new; {code} fails with a parser error: {noformat} ERROR: Instrumentation errorInstrumentation error : c:\Work\clover-hg\clover-core\src\test\resources\javasyntax1.8\LambdaAndMethodReferences.java:78:28:unexpected token: ArrayList com.atlassian.clover.api.CloverException: c:\Work\clover-hg\clover-core\src\test\resources\javasyntax1.8\LambdaAndMethodReferences.java:78:28:unexpected token: ArrayList com.atlassian.clover.instr.java.Instrumenter.instrument(Instrumenter.java:158) com.atlassian.clover.CloverInstr.execute(CloverInstr.java:73) com.atlassian.clover.CloverInstr.mainImpl(CloverInstr.java:49) com.atlassian.clover.JavaSyntaxCompilationTestBase.instrumentSourceFile(JavaSyntaxCompilationTestBase.java:145) com.atlassian.clover.JavaSyntaxCompilationTestBase.instrumentAndCompileSourceFile(JavaSyntaxCompilationTestBase.java:111) com.atlassian.clover.JavaSyntax18CompilationTest.testLambdaAndMethodReferences(JavaSyntax18CompilationTest.java:84) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) junit.framework.TestCase.runTest(TestCase.java:168) junit.framework.TestCase.runBare(TestCase.java:134) junit.framework.TestResult$1.protect(TestResult.java:110) junit.framework.TestResult.runProtected(TestResult.java:128) junit.framework.TestResult.run(TestResult.java:113) junit.framework.TestCase.run(TestCase.java:124) junit.framework.TestSuite.runTest(TestSuite.java:243) junit.framework.TestSuite.run(TestSuite.java:238) org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) org.junit.runner.JUnitCore.run(JUnitCore.java:157) com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:483) com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Caused by: line 78:28: unexpected token: ArrayList com.atlassian.clover.instr.java.JavaRecognizer.conditionalExpression(JavaRecognizer.java:4407) com.atlassian.clover.instr.java.JavaRecognizer.assignmentExpression(JavaRecognizer.java:4274) com.atlassian.clover.instr.java.JavaRecognizer.assignmentExpression(JavaRecognizer.java:4319) com.atlassian.clover.instr.java.JavaRecognizer.expression(JavaRecognizer.java:3366) com.atlassian.clover.instr.java.JavaRecognizer.statement(JavaRecognizer.java:2909) com.atlassian.clover.instr.java.JavaRecognizer.outerCompoundStmt(JavaRecognizer.java:2696) com.atlassian.clover.instr.java.JavaRecognizer.field(JavaRecognizer.java:2265) com.atlassian.clover.instr.java.JavaRecognizer.classBlock(JavaRecognizer.java:1728) com.atlassian.clover.instr.java.JavaRecognizer.classDefinition(JavaRecognizer.java:736) com.atlassian.clover.instr.java.JavaRecognizer.typeDefinition2(JavaRecognizer.java:666) com.atlassian.clover.instr.java.JavaRecognizer.typeDefinition(JavaRecognizer.java:524) com.atlassian.clover.instr.java.JavaRecognizer.compilationUnit(JavaRecognizer.java:445) com.atlassian.clover.instr.java.Instrumenter.instrument(Instrumenter.java:212) com.atlassian.clover.instr.java.Instrumenter.instrument(Instrumenter.java:121) ... 27 more {noformat} ",8 CLOV-1403,"Cloverage view layout is crappy with the Coverage Summary panel","1. Not all buttons are visible by default. 2. Width/height proportion which triggers a change between horizontal/vertical layout is not set correctly. As a result we've got a crappy behavior as on the following screen shot: !cloverage_view_layout.png!",2 CLOV-1404,"Source highlighting label is cropped in the settings dialog","Project Settings > Clover > View ""Out of date"" labels are cropped [^project_settings_clover.png]",2 CLOV-1406,"URISyntaxException from Clover IDEA plugin under IDEA13 on Mac OS X","{noformat} java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar: java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar java.lang.RuntimeException: java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar com.cenqua.clover.idea.LibrarySupport.getCloverClassBase(LibrarySupport.java:150) com.cenqua.clover.idea.build.CloverCompiler$RefreshCloverGlobalLibraryTask.execute(CloverCompiler.java:282) com.intellij.compiler.impl.CompileDriver.a(CompileDriver.java:2375) com.intellij.compiler.impl.CompileDriver.access$900(CompileDriver.java:122) com.intellij.compiler.impl.CompileDriver$8.run(CompileDriver.java:706) com.intellij.compiler.progress.CompilerTask.run(CompilerTask.java:167) com.intellij.openapi.progress.impl.ProgressManagerImpl$TaskRunnable.run(ProgressManagerImpl.java:464) com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178) com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209) com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212) com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171) com.intellij.openapi.progress.impl.ProgressManagerImpl$8.run(ProgressManagerImpl.java:373) com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:436) java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) java.util.concurrent.FutureTask.run(FutureTask.java:138) java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) java.lang.Thread.run(Thread.java:695) com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:153) Caused by: java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar java.net.URI$Parser.fail(URI.java:2810) java.net.URI$Parser.checkChars(URI.java:2983) java.net.URI$Parser.parseHierarchical(URI.java:3067) java.net.URI$Parser.parse(URI.java:3015) java.net.URI.(URI.java:577) com.cenqua.clover.idea.LibrarySupport.getCloverClassBase(LibrarySupport.java:121) ... 19 more java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar: java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar java.lang.RuntimeException: java.net.URISyntaxException: Illegal character in path at index 37: file:/Users/grant/Library/Application Support/IntelliJIdea13/clover-idea-3.2.1.jar com.cenqua.clover.idea.LibrarySupport.getCloverClassBase(LibrarySupport.java:150) {noformat}",2 CLOV-1408,"As a developer I'd like to see JUnit Parameterized tests in the report","Similarly to the Spock framework (CLOV-1256) I'd like to see runtime test names from the JUnit4 parameterized tests. Example: {code:java} import org.junit.*; import org.junit.runner.*; import org.junit.runners.*; import java.util.*; import static org.junit.Assert.*; import static org.junit.runners.Parameterized.*; @RunWith(Parameterized.class) public class FibonacciTest { @Parameters public static Collection data() { return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 },{ 6, 8 } }); } private int fInput; private int fExpected; public FibonacciTest(int input, int expected) { fInput= input; fExpected= expected; } @Test public void test() { assertEquals(fExpected, Fibonacci.compute(fInput)); } } class Fibonacci { static int compute(int a) { return a; } } {code} ",5 CLOV-1409,"Split velocity templates to 2 sets: adg and classic","make a copy of original templates extend HtmlReporter and add option to choose one of them, e.g.: HtmlReporter -style classic/adg ADG is the default one",2 CLOV-1410,"Add report style=adg/classic options for Ant, Maven, Grails","scope: ant, maven, grails plugins new toggle, default adg, pass to HtmlReporter",2 CLOV-1411,"Add radio button style=adg/classic in eclipse and idea IDEs","optional: add radio button in reports wizards alternatively: use the default one (ADG) ",1 CLOV-1412,"Use ADG-compliant colour set for widgets","Replace existing colours by those recommended by ADG: * https://developer.atlassian.com/design/latest/colors.html Scope: (/) tree map (/) cloud view (/) coverage bars (dashboard, package/class/file summary) (/) test results bars (dashboard, test results pages) (/) coverage markers on the page margin (/) class coverage distribution / class complexity diagrams (use ""Blue"" from ADG) (/) colours of hyperlinks ",1 CLOV-1413,"as a developer I expect that Clover will automatically configure IntelliJ IDEA compiler settings","Since IDEA12 a new external build feature has been introduced. It has also an option to perform parallel build (Settings > Compile > Build independent modules in parallel toggle), however Clover does not support parallel instrumentation (see CLOV-1284). Clover should automatically disable the parallel build toggle whenever compilation starts (it can notify about this fact by a baloon), otherwise it will throw various runtime exceptions during compilation.",1 CLOV-1415,"The clover2:clover goal does not pass the sourcepath property to underlying task","*Original problem from the cloned issue:* {quote} Clover database contains FileInfo objects for every source file. One of FileInfo fields is an absolute path to given file. When database is written, it uses current platform file separator for file name ('\' for windows, '/' for Linux/MacOS). However, when database is read it interprets file name using again current platform file separator. As a consequence, when database is generated on Windows and report generated on Linux, it cannot resolve file name properly - it takes whole path as a single path segment, resulting in paths like: /path/from/report/generation/sourcepath/D:/path/from/instrumented/build/file.java As a consequence report generation does create html file containing source code with highlighted coverage. {quote} *Problem with the clover2:clover goal:* The clover2:clover call using a default report descriptor (which is located in the maven-clover2-plugin-X.X.X.jar/default-clover-report.xml). This report descriptor has a reporting defined like: {code:xml} {code} i.e. there is no property. Possible fix #1: * add the property * set it's value to a list of standard source roots, similarly as it's done for tag _excerpt from the CloverReportMojo:_ {code:java} antProject.setProperty(""testPattern"", ""**/src/test/**""); {code} _excerpt from the default-clover-report.xml:_ {code:xml} ... {code} so it could be like this: {code:java} antProject.setProperty(""sourceRootsPattern"", ""**/src/test/*;**/src/main/*""); ... {code} (!) potential problem: build may have source roots different than src/test/xxx and src/main/xxx; in such case sources would not be found; it means that settings this property should be optional; it could be done via boolean flag Possible fix #2: * add the property to the clover2:clover goal * if it's not null then pass it's value to the property in the goal in the report descriptor (!) potential problem: how developers could easily find all source roots in all modules in their maven project in order to pass it as the property? ",2 CLOV-1419,"change project/package statistics to the boxed component","Change this: !package_summary.png! Move it under a horizontal navigation (on overview tab for instance). Keep it as a boxed component (div grid). ",2 CLOV-1420,"change package and class list tables into TablesSortable","Change this (project summary, package summary): !package_and_class_list.png! into a sortable table like this: https://docs.atlassian.com/aui/latest/sandbox/#",2 CLOV-1423,"change contributing tests table to TablesSortable etc","Change a table with contributing tests: !contributing_tests.png! To do: * table into TableSortable * ""Show/hide tests"" label into expander * ""Select all/deselect all"" labels into single master toggle * remember about highlighting of lines of code and class' methods in a table",5 CLOV-1424,"change small class histogram into container","similarly as for coverage statistics put into a box: https://developer.atlassian.com/design/1.2/containers.html this: !small_histogram.png!",1 CLOV-1425,"change dashboard boxes look","This: [^dashboard_boxes.png] should look like this: https://developer.atlassian.com/design/1.2/containers.html",1 CLOV-1426,"change page footer look","This: [^page_footer.png] should look like this: https://developer.atlassian.com/design/1.2/page-footer.html ",1 CLOV-1427,"change cloud tabs","The ""Package risks"" and ""Quick Wins"" tabs: !cloud_tabs.png! should have an ADG tabs look: https://developer.atlassian.com/design/1.2/tabs.html ",1 CLOV-1428,"change classes/tests/results bottom left frame","Change this: !classes_tests_results.png! Scope: * add a title: https://developer.atlassian.com/design/1.2/typography.html * use tabs: https://developer.atlassian.com/design/1.2/tabs.html * use sortable table: https://developer.atlassian.com/design/1.2/tables.html ",2 CLOV-1429,"chage test result labels to lozenges","""pass"" / ""fail"" / ""error"" test statuses shall be changed to Subtle lozenges: https://developer.atlassian.com/design/1.2/lozenges.html ",1 CLOV-1431,"JDK8 sources fail to compile when instrumented by Clover","See the attached comparison of original and instrumented code: [^unicode_decoding_error.png] A problem is as follows: * Clover has a UnicodeDecodingReader class which translates 6-letter character sequences ""\uNNNN"" into a single UTF16 character * this is used to correctly tokenize code identifiers (IDENT) written in non-ascii characters (a variable with German umlaut for instance) In this specific example, some ""\uNNNN"" sequences were translated inside comments, and some characters were ""swallowed"". So for instance a fragment: {noformat} {@code \u} {noformat} ends with ""java: illegal unicode escape"". Related issues: * CLOV-1305 - syntax highlighting problem * CLOV-1131 - Eclipse/IDEA editors get out of sync ",3 CLOV-1432,"Integration tests are not being instrumented in Grails 2.3","Clover does not instrument integration tests in Grails 2.3. Caused by: * new GrailsIntegrationTestCompiler wrapper introduced in Grails 2.3.0 is not being recognized by Clover as a Groovy compiler * GrailsTestRunner calls Groovy compiler internally and this compiler does not have grover.jar on a classpath, thus Clover AST transformer is not called Todo: * check how to recognize/pass inclusion/exclusion patterns to the internal compiler of GrailsTestRunner Workaround: * not available",3 CLOV-1434,"Transitive dependency resolution fails in Grails 2.3 during installation of the Clover plugin","Since Grails 2.3 sth has changed in the dependency resolution mechanism. As a consequence, when the Clover plugin is being installed for a first time, the transitive dependency to com.cenqua.clover:clover is not resolved and this jar is not available on class path. As a consequence build fails when it tries to import ""cloverlib.xml"". Workaround: define a dependency to com.cenqua.clover:clover in BuildConfig.groovy (or in pom.xml) - in the very same way as it was made in Clover-for-Grails 3.1.12 or older under the Grails 2.2. Fix: 1) reconfigure dependencies.groovy / pom.xml ? 2) roll back to a previous approach - i.e. merge clover-grails1 branch into default, produce one plugin version, rollback documentation",1 CLOV-1438,"Create an API for plugging custom I/O handler","Currently Clover uses a standard Java IO/NIO libraries to read from and write to: a coverage database, coverage recording files (global and per-test), test optimization snapshots. This is not sufficient when user want to run an application on a custom file system, such as Apache HDFS. Provide an API which would allow to provide a custom IO handler. Scope: * writing coverage files (global and per-test) * reading/writing database (optional - we deal a lot with file channels which might be a problem; a growable coverage recorder can be used at runtime instead of this) * writing optimization snapshot (optional - not everyone uses test optimization) References: * https://answers.atlassian.com/questions/255286/does-clover-support-to-read-and-write-clover-db-and-coverage-recording-files-from-hdfs * https://answers.atlassian.com/questions/48360/how-can-i-get-functional-test-code-coverage-reports-for-mapreduce-program",8 CLOV-1441,"Clover plugin doesn't load on IDEA 13 Startup","{noformat} null java.lang.NullPointerException com.cenqua.clover.idea.LibrarySupport.getValidatedCloverLibrary(LibrarySupport.java:81) com.cenqua.clover.idea.build.CloverLibraryInjector$1.run(CloverLibraryInjector.java:44) com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:997) com.cenqua.clover.idea.build.CloverLibraryInjector.addCloverLibrary(CloverLibraryInjector.java:61) com.cenqua.clover.idea.build.CloverLibraryInjector.updateModulesDependencies(CloverLibraryInjector.java:35) com.cenqua.clover.idea.ProjectPlugin.projectPostStartup(ProjectPlugin.java:116) com.cenqua.clover.idea.ProjectPlugin$1.run(ProjectPlugin.java:86) com.intellij.ide.startup.impl.StartupManagerImpl$7.run(StartupManagerImpl.java:286) com.intellij.ide.startup.impl.StartupManagerImpl.a(StartupManagerImpl.java:259) com.intellij.ide.startup.impl.StartupManagerImpl.access$100(StartupManagerImpl.java:52) com.intellij.ide.startup.impl.StartupManagerImpl$4.run(StartupManagerImpl.java:184) com.intellij.openapi.project.DumbServiceImpl.a(DumbServiceImpl.java:238) com.intellij.openapi.project.DumbServiceImpl.access$500(DumbServiceImpl.java:53) com.intellij.openapi.project.DumbServiceImpl$IndexUpdateRunnable$1$3.run(DumbServiceImpl.java:420) java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) java.awt.EventQueue.access$200(EventQueue.java:103) java.awt.EventQueue$3.run(EventQueue.java:694) java.awt.EventQueue$3.run(EventQueue.java:692) java.security.AccessController.doPrivileged(Native Method) java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) java.awt.EventQueue.dispatchEvent(EventQueue.java:703) com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:696) com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:524) com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:335) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) java.awt.EventDispatchThread.run(EventDispatchThread.java:91) {noformat} ",2 CLOV-1442,"Use more unique property names in clover.xml","The clover.xml contains the following properties: {code:xml} {code} Their names are not very unique so there's some chance that developer could actually use similar ones in his project. This may lead to clash an Ant properties are not read-only once set. Use more distinct names, e.g. ""clover.project.name"". Update documentation on CAC accordingly. ",2 CLOV-1443,"Clover Grails Plugin fails when tests are launched from IDEA","Steps to reproduce: * import Grails-based project into IntelliJ IDEA * add Clover Grails plugin to the project * run *forked* tests from IDEA Build fails with an error like: {noformat} | Error Error running forked test-app: No such property: testNames for class: _Events (Use --stacktrace to see the full trace) | Error Forked Grails VM exited with error {noformat} Workaround: * disable forked test execution in IDEA Probable cause: IDEA does not call ""grails test-app"" but executes the GrailsScriptRunner, e.g.: {noformat} java -cp ... org.codehaus.groovy.grails.cli.support.GrailsStarter --main org.codehaus.groovy.grails.cli.GrailsScriptRunner {noformat} The most probably this runner does not import the _GrailsTest.groovy, which contains a definition of the testNames property.",2 CLOV-1446,"Tree map report has an empty line in context menu","Open TreeMap report in IDEA, right click on a class, a context menu is opened which has an empty first line: !jump_to_source.png! ",2 CLOV-1447,"Add possibility to configure in Eclipse and IDEA IDEs","The and tasks allow to define section, where we can select coverage recorder type etc. There's no possibility to configure it in Clover-for-Eclipse and Clover-for-IDEA plugins.",5 CLOV-1448,"Test spock under gradle","We don't support Gradle. However, it's worth checking how our Spock works (or not :-) ) with open-source gradle clover plugins available. To do: * prepare a sample app with a build.gradle script * integrate Clover into it using the https://github.com/bmuschko/gradle-clover-plugin * check if spock instrumentation works here * publish results on CAC as a developer guide ",3 CLOV-1449,"Test spock with XML importing","Test how the can be used together with: * Spock Spec classes with @Unroll * test results imported from an external XML file Purpose of test: * check if runtime test names recorded by Clover matches test names reported by Spock Outcome: * document whether it works (and how) or not",2 CLOV-1451,"Fix uncheched warnings for code instrumented by Clover","Follow up of CLOV-1399: {quote} I tried it with 3.2.2 same issue for every instrumented class. [WARNING] /Users/kasperni/workspace/cake-container/cake-container/cake-container-api/target/clover/src-instrumented/org/cakeframework/container/RuntimeContainerException.java:[24,758] unchecked cast required: I found: java.lang.Object It is this generated line that generates the warning: return (I) java.lang.reflect.Proxy.newProxyInstance(l.getClass().getClassLoader(), l.getClass() .getInterfaces(), h); It can be solved by adding a @SuppressWarnings(""unchecked"") to the instrumented file: @SuppressWarnings(""unchecked"") public static I lambdaInc(final int i, final T l, final int si) {........} {quote}",2 CLOV-1455,"///Clover:OFF does not work with lambdas","The following piece of code fails to be instrumented {code:java} public class Foo { // /CLOVER:OFF public static void main(String[] args) { new ConcurrentHashMap<>().computeIfAbsent(""foo"", e -> null); } // /CLOVER:ON } {code} Results in [ERROR] /Users/kasperni/workspace/cake-container/cake-container/cake-container-impl/target/clover/src-instrumented/org/cakeframework/internal/container/handler/Foo.java:[28,58] cannot find symbol symbol: variable __CLR3_2_2133133hrrnhz2t location: class org.cakeframework.internal.container.handler.Foo",2 CLOV-1457,"clover-for-grails plugin is not working with grails.project.fork","Hello, When I run the grails test-app command in grails 2.3.5. I get the following error: {noformat} Error running forked test-app: No such property: testNames for class: _Events groovy.lang.MissingPropertyException: No such property: testNames for class: _Ev ents at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptByteco deAdapter.java:50) at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty( PogoGetPropertySite.java:49) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjec tGetProperty(AbstractCallSite.java:231) at _Events$_run_closure3.doCall(_Events.groovy:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(Refl ectiveInterceptor.java:1254) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java: 90) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1086) at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) {noformat} ",2 CLOV-1459,"native2ascii error converting i18n bundles for plugin","When running with -clover.on in our CI environment (TeamCity), we are getting a weird error: Error native2ascii error converting i18n bundles for plugin [xxxx] java.lang.reflect.InvocationTargetException It's not constrained to a single plugin, typically it lists different plugins. The full stack trace is: {code} [15:28:49][Step 4/8] | Error native2ascii error converting i18n bundles for plugin [spring-security-core-1.2.7.3] java.lang.reflect.InvocationTargetException [15:28:49][Step 4/8] | Error Error executing script TestApp: : java.lang.reflect.InvocationTargetException (NOTE: Stack trace has been filtered. Use --verbose to see entire trace.) [15:28:49][Step 4/8] : java.lang.reflect.InvocationTargetException [15:28:49][Step 4/8] org.codehaus.gant.GantBuilder.invokeMethod(GantBuilder.java:99) [15:28:49][Step 4/8] _GrailsTest_groovy$_run_closure1.doCall(_GrailsTest_groovy:102) [15:28:49][Step 4/8] org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy:185) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy:185) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy) [15:28:49][Step 4/8] org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) [15:28:49][Step 4/8] TestApp$_run_closure1.doCall(TestApp:32) [15:28:49][Step 4/8] org.codehaus.gant.GantMetaClass.invokeMethod(GantMetaClass.java:133) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy:185) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16_closure18.doCall(GantBinding.groovy) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding.withTargetEvent(GantBinding.groovy:90) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding.this$4$withTargetEvent(GantBinding.groovy) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy:185) [15:28:49][Step 4/8] org.codehaus.gant.GantBinding$_initializeGantBinding_closure5_closure16.doCall(GantBinding.groovy) [15:28:49][Step 4/8] gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381) [15:28:49][Step 4/8] gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415) [15:28:49][Step 4/8] gant.Gant$_dispatch_closure7.doCall(Gant.groovy) [15:28:49][Step 4/8] gant.Gant.withBuildListeners(Gant.groovy:427) [15:28:49][Step 4/8] gant.Gant.this$2$withBuildListeners(Gant.groovy) [15:28:49][Step 4/8] gant.Gant$this$2$withBuildListeners$0.callCurrent(Unknown Source) [15:28:49][Step 4/8] gant.Gant.dispatch(Gant.groovy:415) [15:28:49][Step 4/8] gant.Gant.this$2$dispatch(Gant.groovy) [15:28:49][Step 4/8] gant.Gant.invokeMethod(Gant.groovy) [15:28:49][Step 4/8] gant.Gant.executeTargets(Gant.groovy:591) [15:28:49][Step 4/8] gant.Gant.executeTargets(Gant.groovy:590) [15:28:49][Step 4/8] org.grails.wrapper.GrailsWrapper.main(GrailsWrapper.java:93) [15:28:49][Step 4/8] Caused by: java.lang.reflect.InvocationTargetException [15:28:49][Step 4/8] ... 30 more [15:28:49][Step 4/8] Caused by: java.util.ConcurrentModificationException [15:28:49][Step 4/8] com.atlassian.clover.ant.groovy.GroovycSupport.logGroovycTasks(GroovycSupport.java:102) [15:28:49][Step 4/8] com.atlassian.clover.ant.groovy.GroovycSupport.taskStarted(GroovycSupport.java:123) [15:28:49][Step 4/8] org.apache.tools.ant.Project.fireTaskStarted(Project.java:2184) [15:28:49][Step 4/8] ... 30 more [15:28:49][Step 4/8] | Error Error executing script TestApp: : java.lang.reflect.InvocationTargetException [15:28:50][Step 4/8] Process exited with code 1 {code} Running without ""-clover.on"" removes this problem. ",2 CLOV-1462,"ClassNotFoundException when running tests in IDEA 13.1 RC with Clover enabled","Install IDEA 13.1 RC and Clover 3.2.2. Load Java project. Create a run configuration for JUnit, select ""Test kind: All in package"", select ""Before launch: Make"". Run tests with Clover disabled - all tests are executed. Run tests with Clover enabled - all tests are executed, but after second and next runs - ClassNotFoundException on a test class occurs. ",2 CLOV-1466,"Several tests fail with Cannot cast object ... to class 'com_cenqua_clover.CoverageRecorder'","See here for a travis build exhibiting this problem: https://travis-ci.org/thehyve/transmart-core-db/jobs/21220075 19 tests there fail because of this problem. The culprit seems to be this line: https://github.com/thehyve/transmart-core-db/blob/5e8f0400b9ddce75e1d3d2adccf747e42bff3ee6/src/groovy/org/transmartproject/db/dataquery/clinical/TerminalConceptVariablesTabularResult.groovy#L39",3 CLOV-1467,"Rename com.cenqua to com.atlassian","Rename all references to ""Cenqua"" to ""Atlassian"". It affects: * java packages - com.cenqua.* and com_cenqua_clover (/) * Clover-for-Eclipse plugins and features (/) * com.cenqua.clover:clover artifact (clover core) (/) Optional: Rename also Clover-for-Maven plugin from 'maven-clover2-plugin' to 'clover-maven-plugin'. (x) The maven plugin will not be renamed. Reason? Typing 'mvn clover:setup' in a project where clover-maven-plugin is not explicitly defined in pom.xml causes that Maven resolves the 'clover:setup' as 'com.atlassian.maven.plugins:maven-clover-plugin:maven-plugin:3.7' which is wrong. So it will be very confusing for customers. ",3 CLOV-1469,"Maven plugin sholud handle target/generated-test-sources","The AbstractInstrumenter recognizes only the target/generated-sources path: {code:java} private boolean isGeneratedSourcesDirectory(final String sourceRoot) { String generatedSrcDirDefaultLifecycle = File.separator + ""target"" + File.separator + ""generated-sources""; String generatedSrcDirCloverLifecycle = File.separator + ""target"" + File.separator + ""clover"" + File.separator + ""generated-sources""; return sourceRoot.indexOf(generatedSrcDirDefaultLifecycle) != -1 || sourceRoot.indexOf(generatedSrcDirCloverLifecycle) != -1; } {code} It shall also detect the target/generated-test-sources.",1 CLOV-1470,"Maven clover2:setup ignores generated sources","We have several maven projects that contain only generated sources (target/generated-sources/...). The default source directory does not exist for those projects. clover2:setup does not work properly for those projects: the generated sources do not get compiled. We currently work around the issue by creating a marker file in the default source directory.",1 CLOV-1471,"Maven clover2:setup triggers duplicate class exception","We have several maven projects that have more than one source directory. The non-default directories are added using the build-helper plugin. The clover2:setup goal instruments all source folders, but then sets all non-generated directories as source folders on the maven project. That results in compile errors, since source files are both present in the clover instrumented sources and original location. Example: java/src << 1. default source folder java/src-build << 2. additional source folder target/generate-sources/jaxb << 3. generated source folder Case (2) is causing problems.",3 CLOV-1478,"Double instrumentation error when running 'mvn site' on JDK8","Run 'mvn clean site' on the src/it/setTestFailureIgnore project using the JDK8 and Maven 2.2.1. It fails with an error: {noformat} [INFO] Processing files at 1.8 source level. [INFO] Instrumentation error com.atlassian.clover.api.CloverException: Double instrumentation detected: f:\Work\release\release-maven-clover2-plugin-hg\src\it\setTestFailureIgnore\target\clover\src-instrumented\com\atlassian\maven\plugin\clover\samples\setTestFailureIgnore\Simple.java appears to have already been instrumented by Clover. com.atlassian.clover.instr.java.CloverTokenStreamFilter.guardAgainstDoubleInstrumentation(CloverTokenStreamFilter.java:66) ... {noformat} The same site goal works correctly under JDK7. ",1 CLOV-1481,"Invalid instrumentation code for test methods inside anonymous inline classes","Clover generates incorrect reference to the static field __CLR3_2_2_TEST_NAME_SNIFFER in case when a test method is declared inside an inner (static or non-static) or inside an anonymous inline class, which are located inside a non-test top-level class. In such case, the top-level class doesn't have the __CLR3_2_2_TEST_NAME_SNIFFER field (as it's not a test class), but inner/inline classes (which are test ones) are trying to access this field. {noformat} [clover] 2 test methods detected. [javac] ---------- [javac] 1. ERROR in ... [javac] public boolean test() {__CLR3_2_262c962c9htee2hlb.R.globalSliceStart(getClass().getName(),284284);int $CLV_p$=0;java.lang.Throwable $CLV_t$=null;try {boolean $CLV_r$=__CLR3_2_2qua64563cs();$CLV_p$=1;return $CLV_r$;} catch(java.lang.Throwable $CLV_t2$){if($CLV_p$==0&&$CLV_t$==null){$CLV_t$=$CLV_t2$;}_CLR3_2_262c962c9htee2hlb.R.rethrow($CLV_t2$);return false;}finally{CLR3_2_262c962c9htee2hlb.R.globalSliceEnd(getClass().getName(),""com.xyz.RuntimeDebugger.SaveTestCaseAction.getDefaultAvailablePredicate.test"",CLR3_2_2_TEST_NAME_SNIFFER.getTestName(),284284,$CLV_p$,$CLV_t$);}}private boolean __CLR3_2_2qua64563cs(){_CLR3_2_262c962c9htee2hlb.R.inc(284284); [javac] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [javac] __CLR3_2_2_TEST_NAME_SNIFFER cannot be resolved [javac] ---------- [javac] 1 problem (1 error) {noformat} Code example: {code:java} public class SnifferInInnerAndInline { interface TestAction { boolean test(); } static class InnerStaticTest { public void testInnerStatic() { // FAILS HERE } } class InnerTest { public void testInnerNonStatic() { // FAILS HERE } } TestAction testWithInline() { return new TestAction() { public boolean test() { // FAILS HERE (assuming that we have a custom test pattern which matches it) return true; } }; } public static void main(String[] args) { new SnifferInInnerAndInline.InnerStaticTest().testInnerStatic(); new SnifferInInnerAndInline().new InnerTest().testInnerNonStatic(); new SnifferInInnerAndInline().testWithInline().test(); } } {code} ",2 CLOV-1486,"change historical report","scope: header, footer, tables with ""added"" and ""movers"", optionally, put charts in some boxes",1 CLOV-1490,"Clover safeEval method is imcompatible with Groovy's @CompileStatic annotation","When trying to use Clover on a Groovy class that is marked @CompileStatic and it contains a null-safe operator (e.g. Bar bar = foo?.bar), then the groovyc compilation fails with the error: No such property: bar for class: java.lang.Object The error is that the generated {code}$CLV_safeEval${code} method returns an Object instead of the type of the property. This then causes Groovy compiler to fail later. I've created a sample project that exhibits the problem at https://github.com/johnrengelman/clover-grooyv-compilestatic Simply run {code}./gradlew test{code} ",3 CLOV-1492,"Grails' controller methods are not shown as entered","Hello, For some reason the method in a controller is marked as not entered even though the content inside is shown to be executed. Please can you help me rationalize/ understand this? Please refer to me screenshots: index_method_not_executed.png: to see that the index() method is not executed even though its contents are. test_for_index_method.png: the test that is run to get the method to run. ",3 CLOV-1496,"reduce html report size","As a developer I'd like to have small HTML report size in order to reduce disk space consumption, especially in case of builds on CI server. Possible ways to reduce report size: 1) extract list of packages to separate JSON file and load it dynamically using JS function (instead of embedding it on virtually every page) (/) DONE 2) use some html compression utility (which would strip all whitespace etc) https://code.google.com/p/htmlcompressor/#Compressing_selective_content_in_Velocity_templates (x) performance of the HtmlCompressor is unacceptable (+340% time) 3) remove whitespace from most frequent loops from velocity templates (/) DONE",3 CLOV-1497,"improve report accessiblity",http://www.w3.org/TR/wai-aria-practices/#TreeView,3 CLOV-1498,"improve navigation between report entities","We can navigate vertically and horizontally, but on a file level we've got a break: {noformat} project - dashboard | app | test | results | clouds | treemap v package - app | test | results | clouds | +--------------------------------------------------+ v v file - classes | contr tests | methods test class v test {noformat} fix it so that we can jump from test file to test results for a file fix it so that we have one ""source"" tab for a file -> put 'classes and methods' and 'contributing tests' into expandable tables, dialogs etc ",3 CLOV-1500,"implement global search in the html report - backend","Implement search box in a blue app header. Generate JSON data: * packages, files, classes, methods, tests Split into several indexes (for smaller file size) as theoretical size is up to 40MB (200'000 objects per 200 chars). Add ""automatic"" option (up to 10'000 elements). (/) Add options for: /// (/) Add option for HtmlReporter: --globalSearchScope=package,file,class,method,test|auto --globalSearchLimit=10000 to choose which elements shall be searchable.",8 CLOV-1502,"tree view is not compacted properly when only 1 package is present","!tree_view_bug.png! We have com.cenqua + samples.money instead of exactly one (root) node named ""com.cenqua.samples.money"". ",1 CLOV-1503,"provide explanation when number of files is greater than number of classes for a package","There might be a case that number of files > number of classes listed: !more_files_than_classes.png! This is normal behaviour, because by default Clover hides entities having no executable code, such as: empty classes, enums (with no methods), interfaces (with no virtual extension methods). However, this may be confusing for end user. How we could improve this: 1) Set the showEmpty to true by default. Benefit: 'classes >= files' in all cases. Drawback: report will contain unnecessary noise. 2) Add [(?) Help] button above the table. Example: !package_help.png! 3) Add tooltip for 'Files' (TotalElements.getHelp()) 4) Add small text below the class table. For example: ""3 classes are not listed because they contain no executable code."" ",1 CLOV-1505,"replace a vertical navigation component by a sidebar","Instead of the aui-vertical-nav use the aui-sidebar component. ",3 CLOV-1508,"Upgrade HTML report to ADG 2.0 / AUI 5.7","Upgrade AUI library to 5.7.x. We may need to make some corrections of CSS to be compatible (probably: colors, shadows, notification messages).",2 CLOV-1509,"as a developer I'd like to have nanosecond precision for test duration","In reports lots of tests have duration = 0. This is because unit tests are fast and the System.currentTimeMillis() is used to record start and end time of a test. Which is not precise by design. We could increase precision to nanoseconds using System.nanoTime(). Note: we'd still need to call System.currentTimeMillis() to record datetime when test was run.",3 CLOV-1510,"Remove ""See more"" links from the report dashboard","for: * Most complex packages * Most complex classes * Least tested methods * Class Coverage Distribution * Class Complexity ",1 CLOV-1511,"""Show contributing test"" change to ...","""Select tests to highlight the code coverage"" or something similar",1 CLOV-1512,"The ""Show methods"" link does not open the modal dialog","This happens for inner classes (i.e. when a class name contains ""."") May be caused by a way how Modal Dialog handles element id.",1 CLOV-1514,"tool tips in dashboard widgets shall not be displayed on the right","Tool tips are by default placed on the right, so they don't fit in the 'Clover Dashboard' view: !screenshot-1.png!",1 CLOV-1515,"use ADG fonts and colours in Cloud View in IDEA","The ADG HTML report in Clover 4 uses new colour set (shades of red instead of blue-red) for tag clouds. The Clover-for-Eclipse has this theme: [^cloud_view_eclipse.png] but the Clover-for-IDEA still uses the old colour set: [^cloud_view_idea.png]",1 CLOV-1517,"AntIntegrator adds unnecessary double quotes for -Dparam=value JVM options","Class com.atlassian.clover.ci.AntIntegrator puts values of the following properties: -Dclover.historydir and -Dclover.license.cert, -Dclover.license.path in double quotes. On Windows platform it causes problems when a value contains space character - parameters are being split. See BAM-10740. Add a check if OS is Windows and don't add double quotes in such case. ",1 CLOV-1518,"implement global search in the html report - frontend","Implement search box in blue app header. Generate JSON data: * packages, files, classes, methods, tests Split into several indexes (for smaller file size) as theoretical size is up to 40MB (200'000 objects per 200 chars). Add ""automatic"" option (up to 10'000 elements). Add options for to choose which elements shall be searchable.",5 CLOV-1526,"View latest Clover information (BAM-14428)","See BAM-14428.",5 CLOV-1527,"Clover tab with an HTML report generated by Clover 4 shall have a vertical scroll bar (BAM-14777)","See BAM-14777.",1 CLOV-1528,"Configure Fisheye/Crucible build to use Clover 4",NULL,1 CLOV-1534,"Move CloverCompilerAdapter out from org.apache.tools.ant.taskdefs package","The org.apache.tools.ant.taskdefs.CloverCompilerAdapter may cause conflicts with Apache Ant packaged as OSGI bundle which exports the same package. Possible fix: (x) The Javac.getFileList() is a getter for compileList. Try using it - we must ensure that compileList and replacementCompileSet have the same size or (/) Use reflections to access the package-protected field. Thanks to this we could move CloverCompilerAdapter to com.atlassian.clover package. ",1 CLOV-1535,"Application Packages list is empty in Classic report",NULL,1 CLOV-1538,"Instrumenting assignment of method reference to field results in reference to undefined symbol.","Instrumenting the following snippet results in the compilation error [ERROR] clover/src-instrumented/Test.java:[2,18] cannot find symbol [ERROR] symbol: variable __CLR3_3_000hysmxbbd [ERROR] location: class Test Source: public class Test { Runnable r = System::currentTimeMillis; } Instrumented code: /* $$ This file has been instrumented by Clover 3.3.0#2014033113020816 $$ */public class Test { Runnable r = __CLR3_3_000hysmxbbd.lambdaInc(0,System::currentTimeMillis,1); } ",2 CLOV-1540,"BAM-13404 BAM-15085 Use BuildConfig to install Clover",NULL,8 CLOV-1541,"BAM-13208 Automatic integration in multi-module builds","Follow the approach #1",8 CLOV-1542,"BAM-7272 BAM-10516 BAM-11151 Working subdirectory",NULL,8 CLOV-1543,"BAM-14734 BAM-14907 Clover charts","https://jira.atlassian.com/browse/BAM-14734 https://jira.atlassian.com/browse/BAM-14907",5 CLOV-1544,"Release Clover 4.0.2","ant, eclipse, idea, maven, grails",2 CLOV-1546,"Resolve path to clover.jar when packed as OSGI bundle","ClassPathUtil.getCloverJarPath() searches for a JAR in case when URL returned by class loader is like: {noformat} jar:file:!/path/to/clover.jar/com/atlassian/clover/util/ClassPathUtil.class {noformat} or {noformat} file:/path/to/classes/directory/com/atlassian/clover/util/ClassPathUtil.class {noformat} However, it does not handle a case for OSGI bundles, which have an URI like: {noformat} bundle://28.0:2/com/atlassian/clover/util/ClassPathUtil.class {noformat} Fix: use getClass().getProtectionDomain().getCodeSource().getLocation().toURI() ",1 CLOV-1547,"The Grails' @Transactional annotation conflicts with Clover's AST transformations","The @Transactional annotation is the new Grails-y way of controlling transactional behavior in a service. It uses an AST transformation to essentially wrap public methods (if added to the class) in a GrailsTransactionTemplate. So you get code that looks like this: {code:java} public void reject(Invoice invoice) { Reference invoice = new Reference(invoice); CallSite[] arrayOfCallSite = $getCallSiteArray(); GrailsTransactionAttribute $transactionAttribute = (GrailsTransactionAttribute)ScriptBytecodeAdapter.castToType(arrayOfCallSite[9].callConstructor(GrailsTransactionAttribute.class), GrailsTransactionAttribute.class); GrailsTransactionTemplate $transactionTemplate = (GrailsTransactionTemplate)ScriptBytecodeAdapter.castToType(arrayOfCallSite[10].callConstructor(GrailsTransactionTemplate.class, this.transactionManager, $transactionAttribute), GrailsTransactionTemplate.class); $transactionTemplate.execute(new _reject_closure5(this, invoice)); } {code} The real body of the method is in the reject_closure5, which ends up calling a method named ""$tt_reject(...)"". Clover doesn't realize that the code originally under the reject method has essentially been relocated to the $tt__reject method. Given that @Transactional is a core part of Grails (starting in 2.3, I believe) and the recommended way to control transactions going forward, this is probably something that should be addressed in Clover core.",3 CLOV-1552,"Upgrade FastUtil library to version 6.5.2 or later","API was changed since version 4.4.3, some methods used by Clover are missing and there's no direct replacement for them. Migrate Clover's code. ",3 CLOV-1553,"Upgrade Atlassian Extras to 3.2.x","API has changed in Atlassian Extras 3.x vs 2.5. There's no LicenseManagerFactory.getLicenseManager() We can compose our own license manager and decoder using: Version1LicenseDecoder + Version2LicenseDecoder + DelegatingLicenseDecoder + CloverProductLicenseFactory + DefaultLicenseManager However, there are problems with decoding the ""Clover Desktop"" license = the CloverLicenseTest.testDesktopLicense fails. Investigate: * maybe Clover Desktop license format has changed? * or maybe overlooked by atlassian-extras developers? * or ... ?",3 CLOV-1554,"Replace iText library","Replace current iText 2.0.1 library by: * a commercial version of iText 5.x or * a PDFBox (http://pdfbox.apache.org) or other tool based on a good open-source license (Apache 2.0, MIT, BSD, PD).",5 CLOV-1557,"Improve HTML ADG side bar view and a package tree performance",NULL,1 CLOV-1559,"Create Bitbucket Connect Clover Plugin","Bitbucket - Dan Bennett (Team Lead) - Investigate the creation of a Connect plugin to expose Clover functionality in Bitbucket diff & file viewer (same as Stash functionality)",40 CLOV-1560,"S3 Artifact handler corrupts Clover tab in Bamboo","Bamboo 5.7 introduces new artifact handler to store files in Amazon S3. Due to a fact that it works on a file-by-file basis, we cannot expose the entire HTML report as a 'site' embedded in the