Files
School/Anul 3/Semestrul 1/Proiect Colectiv/StoryPointEstimator/data/clover.csv
T
2025-02-06 20:33:26 +02:00

333 KiB

1issuekeytitledescriptionstorypoint
2CLOV-1086Line coverage data is inconsistentI'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
3CLOV-379Surefire classpath is incorrect when depending on a jar and a test-jar from the same maven moduleWe 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: <dependency> <groupId>${parent.groupId}</groupId> <artifactId>server-data-access</artifactId> <version>${version}</version> <type>test-jar</type> <scope>test</scope> </dependency> <dependency> <groupId>${parent.groupId}</groupId> <artifactId>server-data-access</artifactId> <version>${version}</version> </dependency> 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.jar2
4CLOV-1083Setting special instrumentation output dir to a source dir deletes all source!NULL1
5CLOV-579Add method/statement level instrumentation setting in project properties page NULL1
6CLOV-582Make Test Run Explorer perform better and stop locking the UI threadNULL4
7CLOV-1085Message 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
8CLOV-1084No 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
9CLOV-573Clover should prompt to rebuild a project if its flush or initstring settings changeNULL1
10CLOV-701Test 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
11CLOV-906Clover-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
12CLOV-930Implement Test Optimization for Grails: -clover.optimizeRunning -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-run2
13CLOV-940clover + 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
14CLOV-951Assertion 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.<init>(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.<init>(ProjectConfigPanel.java:54) com.cenqua.clover.idea.ProjectPlugin.createComponent(ProjectPlugin.java:328) com.intellij.openapi.options.newEditor.OptionsEditor$Simple.<init>(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
15CLOV-953Occasionally 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 <presetdef>/<macrodef> 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 <presetdef>/<macrodef> 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 <presetdef>/<macrodef> declarations have taken place.3
16CLOV-964<testsources> does not work with Ant groovyc taskSince TestSourceSet is not Serializable it doesn't work with Ant/groovyc. {noformat}Clover failed to integrate with <groovyc/>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
17CLOV-977Clover's embedding of GSON brings in "assembly-descriptor.xml" into clover.jar which causes problems for ejbdoclet, otherssee 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
18CLOV-987Cannot select contexts in IDEA 10.0.2I 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
19CLOV-991Ternary clauses never executed still get coverageI 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
20CLOV-1007clover2:check fails with negative coverage if no class to instrumentThis 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
21CLOV-1011Coverage data not showing up in IntellijI'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
22CLOV-1015Test Optimization says 0 tests should run but all tests are run anywayRecently 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
23CLOV-1018Can't Use "Google App Engine" Run Configuration in IDEA 10.5 when Clover Plug-in is InstalledI 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=<sdk_root> -javaagent:<sdk_root>/lib/agent/appengine-agent.jar Program Parameters: --disable_update_check <war_file_location> Working Directory: <sdk_root>2
24CLOV-1025Log 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
25CLOV-1056IDEA 11 error turning OFF Clover coverageError 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
26CLOV-1062Clover-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
27CLOV-1077Missing icons on TreeView and Cloud Report tabsOn IDEA 11 the "Tree View" and "Cloud Report" tabs have missing icons. See attached screenshot. 2
28CLOV-1082Write up on CAC how to get Clover working with Maven and integration testsIn 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
29CLOV-1087Prepare tutorial how to configure distributed coverage for web applicationsExtend 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
30CLOV-1090Consistent statistics reporting in IDE and HTML reports for subpackagesSee 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) <package name>" and for option 2 like "Statistics for package (with subpackages) <package name>" 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
31CLOV-1092Finish About+Clover-for-Grails pageComplete 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
32CLOV-1097Guide users through Eclipse setupOur 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
33CLOV-1100Drop support for Eclipse 3.4, 3.5 and RAD 7.5Drop 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
34CLOV-1105license information inconsistent in IDEAsee screenshot1
35CLOV-1106bad alignment of "About" box in IDEAsee screenshot1
36CLOV-1108Eclipse does not exclude filtered-out methods from statisticsWhen 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
37CLOV-1109Unit test failure during Clover2 custom lifecycle do not fail buildsThe 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
38CLOV-1111Prepare tutorial how to instrument RCP application under EclipsePrepare 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
39CLOV-1112Reading clover database across platforms does not resolve path correctly for FileInfoClover 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
40CLOV-1129Prepare manual how to set-up cross-platform testingWrite 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
41CLOV-1131Unicode CR/LF characters in javadoc causes Eclipse/IntelliJ editors get out of syncTry 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.<init>(RangeMarkerImpl.java:47) com.intellij.openapi.editor.impl.DocumentImpl.createRangeMarker(DocumentImpl.java:303) com.intellij.openapi.editor.impl.RangeHighlighterImpl.<init>(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
42CLOV-1132Fix Clover-for-IDEA compatibility with IntelliJ IDEA 12IDEA12 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+EAP4
43CLOV-1135Coverage ruler does not read settings from PreferencesA 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
44CLOV-1136Coverage ruler does not refresh correctly when all source code annotations are disabledA 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
45CLOV-1137Remove grover*.jar after buildA 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 <clover-setup/> 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
46CLOV-1138Create utility for upgrading third party libraries bundled in CloverIn 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
47CLOV-1140Make Clover-for-Android prototype publicly availableTake 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
48CLOV-1141Refresh Clover-for-Scala prototypeTasks: * 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
49CLOV-1142Expose a Service Provider Interface for Clover for handling new languagesCreate 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
50CLOV-1143Remove obsolete pages from Clover 3.1 spaceHi 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
51CLOV-1144Support *.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+Maven3
52CLOV-1148Implement integration with Maven Tycho PluginCurrently 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
53CLOV-1149Make possible to see instrumented sources in Clover-for-EclipseClover-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
54CLOV-1150Clover does not instrument groovy source files, (groovy-eclipse compiler) when located in src/main/groovyWhen 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
55CLOV-1151Clover 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
56CLOV-1154Inconsistent popup menu in different IDEA versionsIDEA 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
57CLOV-1155Simple installer for Clover-for-IDEAWhen 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
58CLOV-1156Refresh clover.atlassian.comThe 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
59CLOV-1157Run with Clover as on a project with no CloverClover-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
60CLOV-1158Test Run Explorer does not show test contribution with optimized runWhen you execute optimized test runs, the Test Run Explorer does snow show test contribution data.1
61CLOV-1159Create small legend for Top Risks and Quick Wins in Cloud reportCurrently 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
62CLOV-1160Change default sort order in coverage report for packages/classes/methodsCoverage 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/IDE2
63CLOV-1161Add drop-down with two options for coverageAdd 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
64CLOV-1162Generate cumulative statement / complexity metric for need of methodContext filteringA 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} <methodContext name="trivial" regexp=".*" maxStatements="1"/> {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 <object>;" // if you use <methodContext name="trivial" regexp=".*" maxStatements="1"> // 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
65CLOV-1165Fix AbstractAntLoggerThe 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
66CLOV-1166Clover 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
67CLOV-1167Grails Clover Plugin does not intercept 'testc' compilerGrails 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
68CLOV-1170CloverOptimizerMojo 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} <include>**/Test1.java, **/Test2.java</include> {noformat} (2) regular expression instead of Ant-style pattern {noformat} <include>%regex[.*Test.class]</include> {noformat} See: http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html *Workaround:* (1) use separate entries, like: {noformat} <include>**/Test1.java</include> <include>**/Test2.java</include> {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
69CLOV-1173Add maxComplexity / maxStatements for Clover-for-MavenAnt has extra maxComplexity and maxStatements attributes available which are not supported in Maven plugin, for example: {code:xml} <methodContext name="simple_method" regexp="(.* )?public .*(get|set|is)[A-Z0-9].*" maxStatements="1"/> {code} in Maven we have _name_ and _regexp_ attributes only: {code:xml} <configuration> <methodContexts> <!-- vvvvv name vvvvvv regexp --> <simple_method>((.* )?public .*(get|set|is)[A-Z0-9].*</simple_method> </methodContexts> </configuration> {code} *Possible solution* Create <methodContextsExt> which would accept entries like: {code:xml} <methodContextsExt> <methodContext> <name>simple_method</name> <regexp>(.* )?public .*(get|set|is)[A-Z0-9].*</regexp> <maxComplexity>10</maxComplexity> <maxStatements>10</maxStatements> <!-- for CLOV-1162: --> <maxCumulativeComplexity>20</maxCumulativeComplexity> <maxCumulativeStatments>20</maxCumulativeStatments> </methodContext> <methodContextsExt> ... more ... {code} Alternatively, extend parsing of existing <methodContexts> tag so whenever it finds the <methodContext> entry it will not treat it as name of new context but as a structure from sample above. See also CLOV-1162.2
70CLOV-1175Make HTML report more consistent about number of classesSee attached screenshot. HTML report should list interfaces too.2
71CLOV-1176The 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} <target name="clover.log"> <clover-log codeType="APPLICATION"/> <clover-log codeType="TEST"/> <clover-log codeType="ALL"/> </target> {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 <clover-log> requires the <testSources> tag to be defined, for instance: {code:xml} <clover-log codeType="TEST"> <testSources dir="src" includes="**/*Test*"/> </clover-log> {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 [<clover-setup>|https://confluence.atlassian.com/display/CLOVER/clover-setup] task when the <testsources> tag is not defined. 3
72CLOV-1177Errors in ErrorLog when toggling between projects with Dashboard view active1) 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.<init>(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
73CLOV-1178Fix ruler coloring when include coverage from passed only is enabledEclipse. 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
74CLOV-1179Highlight whole method body if method is not coveredIf 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
75CLOV-1181Multiple test cases in Test Run Explorer in IDEAQuickly 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
76CLOV-1182Multiple test cases in Test Runs view in EclipseIf 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
77CLOV-1183Cloud Report in IDEA shows interfacesCloud 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
78CLOV-1184Check Now button does not work if project is not opened in IDEAInstall 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
79CLOV-1185Test optimization is broken in IDEA11 and aboveJetBrains 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
80CLOV-1186IDEA12 JavaSourceTransformingCompiler functionality has been removedSince 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-946125
81CLOV-1187Don't spam the console with println anytime clover grails plugin is installedFrom 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
82CLOV-1188Aggregate coverage by current author and commit regexI 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
83CLOV-1190The <testsources> tag from <clover-setup> is not passed to groovycAs 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
84CLOV-1192Create ClassInfo objects for anonymous inline classesDuring 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} <class name="AggregatedMetrics.C" qualifiedName="AggregatedMetrics.C"> <metrics statements="5" aggregatedStatements="5"/> <method name="hasNext() : boolean"> <metrics statements="1" aggregatedStatements="1"/> </method> <method name="next() : Object"> <metrics statements="1" aggregatedStatements="1"/> </method> <method name="remove() : void"> <metrics statements="0" aggregatedStatements="0"/> </method> <method name="methodThree() : Iterator"> <metrics statements="2" aggregatedStatements="2"/> </method> <method name="methodFour() : void"> <metrics statements="1" aggregatedStatements="1"/> </method> </class> {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
85CLOV-1193as 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<Foo> 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<Foo> ), introducing foreach loops etc ** this will be done gradually during daily development 1
86CLOV-1195Groovy 2.x @CompileStatic annotation causes static methods to be ignored by CloverAdding @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
87CLOV-1196Add testSources parameter for clover2:clover mojoThe Ant <clover-report/> task has an optional nested <sourcepath> 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 <sourcepath> parameter for clover2:clover MOJO.1
88CLOV-1197Perform migration of CLMVN and CLMVNONE from studio.plugins.atlassian.comThe 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
89CLOV-1202Compile maven-clover2-plugin using JDK1.5Currently 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
90CLOV-1203Update Supported-Platforms pageOn 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
91CLOV-1204Remove retrotranslatorRemove 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
92CLOV-1205CLMVNONE new property: maven.clover.instrumentationLevelMoved 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
93CLOV-1206CLMVNONE Use includes, instead of nested include to allow more than one pattern when mergingMoved 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} <ant:cloverDbSet dir="${_multiproject_basedir}"> <ant:include name="${maven.clover.merge.databases}"/> </ant:cloverDbSet> {noformat} to: {noformat} <ant:cloverDbSet dir="${_multiproject_basedir}" includes="${maven.clover.merge.databases}"/> {noformat} 1
94CLOV-1207CLMVNONE Integrate Distributed coverageMoved from https://studio.plugins.atlassian.com/browse/CLMVNONE-13 Integrate Distributed coverage with Clover-Maven1-Plugin 3
95CLOV-1208Show warning if new update is out of scope of the current licenseCase: * 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 box1
96CLOV-1209Auto update version check reports new version when version strings are identicalUnder 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
97CLOV-1227Add <profiles> element for <clover-setup> and <clover-instr>Enhance Ant tasks by adding new sub-types and attributes: {code:xml} <clover-setup> <!-- the same for <clover-instr> --> <profiles> <!-- AntCloverProfiles with List<AntCloverProfile> --> <profile name="default" coverageRecorder="..."> <!-- copied as CloverProfile to InstrumentationProfileConfig --> </profile> <!-- more profiles possible, but we will handle "default" only right now --> </profiles> </clover-setup> {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
98CLOV-1228Document <profiles> element on CACWrite 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
99CLOV-1229Add profiles for InstrumentationConfigNULL1
100CLOV-1230Embed clover profile array in instrumented classesEnhance 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
101CLOV-1231Use GrowableBitSet for PerTestRecorder.OneIn 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
102CLOV-1232Create GrowableBitSet classextend 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
103CLOV-1235Dynamically select coverage recorder based on clover.profileClover.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
104CLOV-1236Add 'clover.enabled' system propertyIf set to 'false' it should disable recording of the coverage data at runtime.1
105CLOV-1237as 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 <clover-embed-runtime-jar targetJar="my.jar"/> which will allow to manually put runtime classes into it. 3) Check if it would be possible to intercept all <jar/> 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 <targetJar> 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
106CLOV-1238Split clover-core into clover-runtime + clover-core1) 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
107CLOV-1239Create <clover-embed-runtime> taskCreate Ant task: {noformat} <clover-embed-runtime targetFile="jar/war/ear file"/> {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 <jar/> task for this or handle zip directly).3
108CLOV-1240Create clover2:embed-runtime-jar goalCreate MOJO for: {noformat} clover2:embed-runtime-jar {noformat} which will read the <targetJar> property and do the same what Ant task does. Difference: we might use maven-assembly-plugin and download clover-runtime artifact for this.3
109CLOV-1241Maven extracts clover-runtime into target/classes or target/classes-cloverAutomatic 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
110CLOV-1242Maven: intercept maven-jar-plugin and add clover-runtimeCheck 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
111CLOV-1243Maven: intercept maven-ear-plugin and add clover-runtimeThe same as CLOV-1242 but for maven-ear-plugin3
112CLOV-1244Maven: intercept maven-rar-plugin and add clover-runtimeThe same as CLOV-1242 but for maven-rar-plugin3
113CLOV-1245Maven: intercept maven-war-plugin and add clover-runtimeThe same as CLOV-1242 but for maven-war-plugin3
114CLOV-1246Maven: intercept maven-cargo-plugin and add clover-runtime dependencyThe maven-cargo-plugin is the most popular plugin for running in-container tests. Add <dependency> for clover-runtime there. Add configuration option to have a possibility to disable this.5
115CLOV-1247Eclipse: extract clover-runtime classes into build directoryExtract 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
116CLOV-1248IDEA: extract clover-runtime classes into build directoriesIDEA 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
117CLOV-1249Grails: extract clover-runtime into build directoryUsually it's here: <home>\.grails\X.Y.Z\projects\<project_name>\classes8
118CLOV-1250Prepare integration tests for GrowableCoverageRecorderIntegration 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
119CLOV-1251Prepare integration tests for SharedCoverageRecorderIntegration 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
120CLOV-1253Some 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=<empty> and clover.pertestcoverage.threading=<empty> - DEFAULT POLICY * Synchronized clover.pertest.coverage=<empty> and clover.pertestcoverage.threading=synchronized * Volatile - clover.pertest.coverage=<empty> 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
121CLOV-1254Add Ant dependendency to com.cenqua.clover:clover maven artifactProblem 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.<init>(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
122CLOV-1255Prepare code example for GrailsPrepare sample Grails project with domain classes, controllers and unit tests which will use the 'shared' coverage recorder.2
123CLOV-1257Add 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
124CLOV-1258Upgrade third party libraries used by CloverUpgrade 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
125CLOV-1259Reduce friction in tutorialMake 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
126CLOV-1260Add url for 'utils.js' home pageIn Clover-for-Eclipse and Clover-for-IDEA "About" dialogs the Utils.js link does not open the library home page. 2
127CLOV-1261PDF report with "include failed test coverage" option failsEclipse 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
128CLOV-1262IDEA Darcula theme ignores <table border=0>Clover's "About" dialog looks ugly when the "Darcula" theme is selected in IDEA 12. Despite having <table border="0"> in JEditorPane("text/html"), it shows table with a border. Example: !clover_about_idea12_themes.png!3
129CLOV-1263Race condition in IDEA during full rebuild and test executionClover-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
130CLOV-1264Performance problem with SHARED coverage recorder in Grails appFollow 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
131CLOV-1265as 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
132CLOV-1266Check how clover.db can be accessed from build server and IDE processes at onceprobably 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
133CLOV-1267Check how parallel instrumentation can be handledExternal 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
134CLOV-1268Implement clover.db sharing between build server and IDE processesBased on analysis13
135CLOV-1269Implement parallel compilation handlingBased on analysis of CLOV-126713
136CLOV-1270Write sequential integration tests for build serverPrepare 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
137CLOV-1271Test IDEA IDE - build server interactionExploratory tests in user interface.5
138CLOV-1273Reduce coverage requirements for groovy safe operatorCurrently 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
139CLOV-1279Document how to configure Clover + Bamboo with 'mvn deploy' goal on CACThe 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
140CLOV-1280Error when trying to Check for an UpdateI 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
141CLOV-1281Improve message for NoSuchRegistryExceptionSee https://confluence.atlassian.com/x/AIP3F A message "Clover registry file: <path/to/clover.db> does not exist." is too general and does not help developer to understand what the exact problem is. Find a more meaningful message. 1
142CLOV-1285Write parallel integration tests for build serverCreate IT for external build process with a parallel compilation enabled.13
143CLOV-1286as a developer I'd like to build projects using 'classic' build in IDEA12Make 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
144CLOV-1287Code instrumentation using jps-buildersscope: * java code instrumentation * statement/method contexts * test detection 20
145CLOV-1288Implement communication between IDEA IDE and JPS builder * notifications about build events, progress, error handling * model refreshes13
146CLOV-1289Support custom metrics in PDF reportCurrently the PDF report does not handle <columns> element so it's not possible to have a custom set of metrics in the summary. 5
147CLOV-1291PDF report with class-level and method-level summaryThe PDF report contains package-level coverage table. Add an option for: * <clover-report> 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
148CLOV-1292Check how parallel instrumentation sessions can be handledExternal 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 <parallel> + <javac> 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
149CLOV-1294Implement Clover data serialization from IDE to JPSThe following data must be serialized and passed to JPS builder: * global configuration - other.xml (license key, sid, install date) * project settings - <project>.ipr (flush policy, initstring etc ...) * module settings - <module>.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
150CLOV-1295Prepare documentation on CAC and AACOn 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 AAC3
151CLOV-1297HTML report shows only one test result per file if external XML JUnit files are usedIn the <clover-report> we can define <testresults> 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
152CLOV-1298Contributed and unique coverage are equalPossible bug. Investigate why these values are identical for MoneyBags tutorial. !unique_and_contributed_coverage.png!3
153CLOV-1299Find workaround or fix for IDEA-108852See http://youtrack.jetbrains.com/issue/IDEA-1088528
154CLOV-1301Add more values for a 'threads' drop-down in report dialogThe '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
155CLOV-1302The 'include line info' toggle works in the opposite wayThis toggle !include_line_info.png! works exactly opposite: when selected, the XML report does NOT contain <line> tags; and vice versa.2
156CLOV-1303Exclusion icon decoration is not visible in IDEAAffects 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
157CLOV-1326Class loader fails on clover.jar package-infoOccurs 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
158CLOV-1328as a Clover developer I'd like to use the latest version of ANTLRClover 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 etc13
159CLOV-1333as a developer I'd like to instrument Java8 new language featuresThis 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 * reporting20
160CLOV-1335as a developer I'd like to generate reports with Java8 sourcesNew 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
161CLOV-1336as a developer I'd like to have information about lambdas in the Clover database1) 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
162CLOV-1337as a developer I want be able to select 1.8 language levelThe "1.8" language level shall be available for: * <clover-setup> <clover-instr> 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
163CLOV-1338Warn if directory selected on Test Classes tab is disabled on Source Files tabOn 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
164CLOV-1339The <testmethod name=".*> does not match constructors*Problem:* If you declare custom test detector, for instance: {code:xml} <clover-setup> <testsources dir="src/test/java"> <testclass name=".*"> <testmethod name=".*"/> </testclass> </testsources> </clover-setup> {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
165CLOV-1341Implicit 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
166CLOV-1344Added LICENSES.html file to Clover artfiactsAdd 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
167CLOV-1348review navigation links on a page summaryframes/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
168CLOV-1350Add 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
169CLOV-1352Create code samples with java8 syntaxannontations on java types repeating annotations lambdas virtual extension methods13
170CLOV-1353Prepare unit tests compiling and instrumenting code samplestest: 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 correctly13
171CLOV-1354Set up a Bamboo build for JDK1.8run all clover tests, including tests of java8 syntax on JDK1.8 on Bamboo3
172CLOV-1355Add new grammar rules for java8 syntaxjust 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 class3
173CLOV-1357as an administrator I need to monitor Clover usage on machinesAs 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
174CLOV-1358Enhance 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 <clover-setup> and <clover-instr> 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
175CLOV-1359Fix test optimization and check all class versionsDepends 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
176CLOV-1360Analyse 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
177CLOV-1361Implement test name to method name mapping in CloverBased 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
178CLOV-1362Add 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
179CLOV-1363Ensure that reports show the test name and not the method nameMake 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
180CLOV-1369as 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
181CLOV-1375Extend 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 files8
182CLOV-1376Change signature of getXyz() methods in HasXyz interfacesCurrent signatures have <? extends X>, for example: {code:java} List<? extends MethodInfo> 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<HasMetrics> methodMetrics = classInfo.getMethods() {code} Fix: change to <? super X>. Note: We may need to expose additional methods in interface. They could throw Exception("not implemented") or return nulls.5
183CLOV-1377Create 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
184CLOV-1378Create 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
185CLOV-1379Create 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
186CLOV-1380Create 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<TestCaseInfo> allTestCaseInfos = db.getCoverageData().getTests(); for (TestCaseInfo tci : allTestCaseInfos) { ... } snapshot.store(); {code} *Fix:* Create proper interfaces/classes in c.a.c.api.optimization 8
187CLOV-1381Add showInnerFunctions and showLambdaFunctions to clover2:setupCommand line tools and a <clover-report> 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
188CLOV-1382Add lambda toggle to report wizards in Eclipse and IDEAAdd 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
189CLOV-1384Fully 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
190CLOV-1385Perform Scala spikeThis 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 * prioritisation5
191CLOV-1387Clover 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
192CLOV-1388as a developer I'd like to have Spock @Unroll annotation being recognized by CloverThe {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
193CLOV-1389Instrumentation of a branch condition with a generic type leads to javac compilation error*For a declaration like this:* {code:java} public <T> 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> 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
194CLOV-1390clover 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
195CLOV-1392as a code reviewer I'd like to see ADG fonts and colours in the HTML reportNULL40
196CLOV-1393review ADG page layout in the HTML reportreview layouting of various components on the page and an interaction between them1
197CLOV-1395IDEA13 compatiblity issuesCompatiblity 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
198CLOV-1396"No such property: testTargetPatterns" exception with Grails 2.3Unable 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
199CLOV-1397Java+Groovy compilation fails with Clover enabled in IntelliJ 12.1.xWhen 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
200CLOV-1398Java 1.8 Exceptions not being propagated correctlyI 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.<init>(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 fine3
201CLOV-1399Java 1.8 compilation fails when lambda is passed to a generic argumentThe following piece of code fails to be instrumented {code:java} public class Fails<N> { public final <S extends N> Iterable<S> depthFirstTraversal(Class<S> type) { return (Iterable<S>) depthFirstTraversal(e -> type.isInstance(e)); } public final Iterable<N> depthFirstTraversal(Predicate<? super N> 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 <S>depthFirstTraversal(java.lang.Class<S>) in org.cakeframework.internal.util.tree.Fails and method depthFirstTraversal(java.util.function.Predicate<? super N>) 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
202CLOV-1401Clover fails to instrument generic type with a constructor referenceThis works fine: {code:java} myLambda = ArrayList::new; // javac error since JDK8 b114 myLambda = ArrayList::<String>new; {code} But the following: {code:java} myLambda = ArrayList<String>::new; myLambda = ArrayList<String>::<String>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
203CLOV-1403Cloverage view layout is crappy with the Coverage Summary panel1. 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
204CLOV-1404Source highlighting label is cropped in the settings dialogProject Settings > Clover > View "Out of date" labels are cropped [^project_settings_clover.png]2
205CLOV-1406URISyntaxException 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.<init>(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
206CLOV-1408As a developer I'd like to see JUnit Parameterized tests in the reportSimilarly 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<Object[]> 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
207CLOV-1409Split velocity templates to 2 sets: adg and classicmake 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 one2
208CLOV-1410Add report style=adg/classic options for Ant, Maven, Grailsscope: ant, maven, grails plugins new toggle, default adg, pass to HtmlReporter2
209CLOV-1411Add radio button style=adg/classic in eclipse and idea IDEsoptional: add radio button in reports wizards alternatively: use the default one (ADG) 1
210CLOV-1412Use ADG-compliant colour set for widgetsReplace 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
211CLOV-1413as a developer I expect that Clover will automatically configure IntelliJ IDEA compiler settingsSince 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
212CLOV-1415The clover2:clover goal does not pass the sourcepath property to underlying <clover-report> 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 <clover-report> 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} <current outfile="${output}" summary="${summary}" charset="${charset}" title="${title}" titleAnchor="${titleAnchor}" span="${span}" alwaysReport="${alwaysReport}" showInnerFunctions="${showInnerFunctions}" showLambdaFunctions="${showLambdaFunctions}"> <format refid="clover.format"/> <testsources refid="test.sources"/> <columns refid="clover.columns"/> </current> {code} i.e. there is no <sourcepath> property. Possible fix #1: * add the <sourcepath> property * set it's value to a list of standard source roots, similarly as it's done for <testsources> tag _excerpt from the CloverReportMojo:_ {code:java} antProject.setProperty("testPattern", "**/src/test/**"); {code} _excerpt from the default-clover-report.xml:_ {code:xml} <fileset id="test.sources" dir="${projectDir}"> <include name="${testPattern}"/> </fileset> ... <testsources refid="test.sources"/> {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 <sourcepath> property should be optional; it could be done via boolean flag Possible fix #2: * add the <sourcepath> property to the clover2:clover goal * if it's not null then pass it's value to the <sourcepath> property in the <clover-report> 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
213CLOV-1419change project/package statistics to the boxed componentChange this: !package_summary.png! Move it under a horizontal navigation (on overview tab for instance). Keep it as a boxed component (div grid). 2
214CLOV-1420change package and class list tables into TablesSortableChange this (project summary, package summary): !package_and_class_list.png! into a sortable table like this: https://docs.atlassian.com/aui/latest/sandbox/#2
215CLOV-1423change contributing tests table to TablesSortable etcChange 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 table5
216CLOV-1424change small class histogram into containersimilarly as for coverage statistics put into a box: https://developer.atlassian.com/design/1.2/containers.html this: !small_histogram.png!1
217CLOV-1425change dashboard boxes lookThis: [^dashboard_boxes.png] should look like this: https://developer.atlassian.com/design/1.2/containers.html1
218CLOV-1426change page footer lookThis: [^page_footer.png] should look like this: https://developer.atlassian.com/design/1.2/page-footer.html 1
219CLOV-1427change cloud tabsThe "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
220CLOV-1428change classes/tests/results bottom left frameChange 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
221CLOV-1429chage 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
222CLOV-1431JDK8 sources fail to compile when instrumented by CloverSee 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
223CLOV-1432Integration tests are not being instrumented in Grails 2.3Clover 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 available3
224CLOV-1434Transitive dependency resolution fails in Grails 2.3 during installation of the Clover pluginSince 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 documentation1
225CLOV-1438Create an API for plugging custom I/O handlerCurrently 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-program8
226CLOV-1441Clover 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
227CLOV-1442Use more unique property names in clover.xmlThe clover.xml contains the following properties: {code:xml} <property name="project.name" value="${ant.project.name}"/> <!-- By default, use the ant project name. --> <property name="project.title" value="${project.name}"/> <!-- If no title is set, use the project.name. --> <property name="test.target" value="test"/> <!-- The name of the target which runs the tests. --> {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
228CLOV-1443Clover Grails Plugin fails when tests are launched from IDEASteps 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
229CLOV-1446Tree map report has an empty line in context menuOpen 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
230CLOV-1447Add possibility to configure <profiles> in Eclipse and IDEA IDEsThe <clover-setup> and <clover-instr> tasks allow to define <profiles> 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
231CLOV-1448Test spock under gradleWe 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
232CLOV-1449Test spock with XML importingTest how the <clover-report> 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 not2
233CLOV-1451Fix uncheched warnings for code instrumented by CloverFollow 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, T extends I> I lambdaInc(final int i, final T l, final int si) {........} {quote}2
234CLOV-1455///Clover:OFF does not work with lambdasThe 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.Foo2
235CLOV-1457clover-for-grails plugin is not working with grails.project.forkHello, 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
236CLOV-1459native2ascii error converting i18n bundles for pluginWhen 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
237CLOV-1462ClassNotFoundException when running tests in IDEA 13.1 RC with Clover enabledInstall 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
238CLOV-1466Several 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#L393
239CLOV-1467Rename com.cenqua to com.atlassianRename 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
240CLOV-1469Maven plugin sholud handle target/generated-test-sourcesThe 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
241CLOV-1470Maven clover2:setup ignores generated sourcesWe 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
242CLOV-1471Maven clover2:setup triggers duplicate class exceptionWe 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
243CLOV-1478Double instrumentation error when running 'mvn site' on JDK8Run '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
244CLOV-1481Invalid instrumentation code for test methods inside anonymous inline classesClover 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
245CLOV-1486change historical reportscope: header, footer, tables with "added" and "movers", optionally, put charts in some boxes1
246CLOV-1490Clover safeEval method is imcompatible with Groovy's @CompileStatic annotationWhen 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
247CLOV-1492Grails' controller methods are not shown as enteredHello, 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
248CLOV-1496reduce html report sizeAs 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 (/) DONE3
249CLOV-1497improve report accessiblityhttp://www.w3.org/TR/wai-aria-practices/#TreeView3
250CLOV-1498improve navigation between report entitiesWe 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
251CLOV-1500implement global search in the html report - backendImplement 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: <clover report>/<current>/<format>/<globalSearch scope="package,file,class,method,test|auto" limit="10000"/> (/) Add option for HtmlReporter: --globalSearchScope=package,file,class,method,test|auto --globalSearchLimit=10000 to choose which elements shall be searchable.8
252CLOV-1502tree 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
253CLOV-1503provide explanation when number of files is greater than number of classes for a packageThere 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
254CLOV-1505replace a vertical navigation component by a sidebarInstead of the aui-vertical-nav use the aui-sidebar component. 3
255CLOV-1508Upgrade HTML report to ADG 2.0 / AUI 5.7Upgrade AUI library to 5.7.x. We may need to make some corrections of CSS to be compatible (probably: colors, shadows, notification messages).2
256CLOV-1509as a developer I'd like to have nanosecond precision for test durationIn 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
257CLOV-1510Remove "See more" links from the report dashboardfor: * Most complex packages * Most complex classes * Least tested methods * Class Coverage Distribution * Class Complexity 1
258CLOV-1511"Show contributing test" change to ..."<a>Select tests</a> to highlight the code coverage" or something similar1
259CLOV-1512The "Show methods" link does not open the modal dialogThis happens for inner classes (i.e. when a class name contains ".") May be caused by a way how Modal Dialog handles element id.1
260CLOV-1514tool tips in dashboard widgets shall not be displayed on the rightTool tips are by default placed on the right, so they don't fit in the 'Clover Dashboard' view: !screenshot-1.png!1
261CLOV-1515use ADG fonts and colours in Cloud View in IDEAThe 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
262CLOV-1517AntIntegrator adds unnecessary double quotes for -Dparam=value JVM optionsClass 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
263CLOV-1518implement global search in the html report - frontendImplement 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 <clover report> <index scope="package, file, ..., method | auto"> to choose which elements shall be searchable.5
264CLOV-1526View latest Clover information (BAM-14428)See BAM-14428.5
265CLOV-1527Clover tab with an HTML report generated by Clover 4 shall have a vertical scroll bar (BAM-14777)See BAM-14777.1
266CLOV-1528Configure Fisheye/Crucible build to use Clover 4NULL1
267CLOV-1534Move CloverCompilerAdapter out from org.apache.tools.ant.taskdefs packageThe 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
268CLOV-1535Application Packages list is empty in Classic reportNULL1
269CLOV-1538Instrumenting 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
270CLOV-1540BAM-13404 BAM-15085 Use BuildConfig to install CloverNULL8
271CLOV-1541BAM-13208 Automatic integration in multi-module buildsFollow the approach #18
272CLOV-1542BAM-7272 BAM-10516 BAM-11151 Working subdirectoryNULL8
273CLOV-1543BAM-14734 BAM-14907 Clover chartshttps://jira.atlassian.com/browse/BAM-14734 https://jira.atlassian.com/browse/BAM-149075
274CLOV-1544Release Clover 4.0.2ant, eclipse, idea, maven, grails2
275CLOV-1546Resolve path to clover.jar when packed as OSGI bundleClassPathUtil.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
276CLOV-1547The Grails' @Transactional annotation conflicts with Clover's AST transformationsThe @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
277CLOV-1552Upgrade FastUtil library to version 6.5.2 or laterAPI 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
278CLOV-1553Upgrade Atlassian Extras to 3.2.xAPI 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
279CLOV-1554Replace iText libraryReplace 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
280CLOV-1557Improve HTML ADG side bar view and a package tree performanceNULL1
281CLOV-1559Create Bitbucket Connect Clover PluginBitbucket - 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
282CLOV-1560S3 Artifact handler corrupts Clover tab in BambooBamboo 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 <iframe>. As a consequence it looks like this: !clover-tab-with-s3-handler.png! *Workaround:* Do not use S3 artifact handler for builds with Clover. Default handler settings can be overridden in Plan configuration > Miscellaneous: !artifact_handlers.png! *Possible fixes:* 1) Implement a wrapper on S3 handler, which would download all files from an artifact definition to some temporary directory and expose it in <iframe> * problem: Clover's reports may have up to several GB for large projects, downloading all files every time someone opens the 'Clover' tab will be time consuming, we'd need to keep such artifacts for a longer period of time 2) Add warnings for Clover integration in the UI in case when S3 handler is found. Write information about this limitation on confluence.atlassian.com. 3) Create a ZIP archive out of Clover Report artifact and give user an ability to download this file. 4) Add extra option in artifact definition so that user could select which handler should keep given artifact. Thanks to this, S3 could be excluded. 5) Due to a fact that new Clover HTML ADG reports do not contain frames, we could think about a thin wrapper, which would download only one page and replace all original links in the HTML file by proper links to S3; if user would click on a link, he would get another page processed this way... * we'd have to handle *.js, *.css, images etc too. 5b) Create something like a "ZIP File Handler", which could serve files from an archive (then we could pack Clover's HTML report and store on S3 or any other medium). It would also require rewriting links. 6) Look for some solution provided by Amazon, such as Static Website Hosting on S3 http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html 8
283CLOV-1561Distributed Coverage does not work due to java.rmi.UnmarshalException{noformat} Received result: Remote_Stub[UnicastRef2 [liveRef: [endpoint:[192.168.157.181:11 98,clover.gnu.cajo.invoke.Remote$RCSF@732e103d](remote),objID:[-26c3f6bf:148ea10 98a9:-7ffb, -3801964032288496245]]]] Started proxy: Thread-9 cutOff(java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableE xception: com.atlassian.clover.ErrorInfo); from: localhost:1198. Attempting to r econnect. {noformat}1
284CLOV-1567Test optimization in IDEA 14 shows wrong number of classesThere are 2 test classes in the 'Moneybags' tutorial project. Running test optimization in IDEA 14 (EAP build 138.2458.8) shows "3 test classes". !idea14_clover_test_optimization.png!2
285CLOV-1568An orphaned lozenge when there are no search results !html_adg_orphaned_lozenge.png!1
286CLOV-1569A wrong caption in a search box in an HTML ADG report!search_box_wrong_caption.png!1
287CLOV-1570A historical report contains link to an XML report!wrong_links_in_a_historical_report.png!1
288CLOV-1571Upgrade third party libraries used by Clover - 2nd phaseUpgrade third party libraries to their latest versions: * Antlr 4.0, including java.g syntax file (x) tracked in CLOV-1329, CLOV-1331 and CLOV-1332 * atlassian-extras 3.2 (x) tracked in CLOV-1553 * cajo 1.175 * commons-lang3 3.3.2 (x) * fastutil 6.5.2 (x) tracked in CLOV-1552 * GSON 2.2.2 * JDOM 2.0.4 * JSON - replace by com.google.code.gson:gson Upgrade feasibility to be verified: * theJIT * KTreeMap/JTreeMap Get rid of: * Overlibvms (x) not until we drop Classic reports (Clover 4.1) * Utils.js (x) not until we drop Classic reports (Clover 4.1) * iText (x) tracked in CLOV-1554 To be considered: * upgrade Log4j to or 2.0.x8
289CLOV-1572BAM-699 BAM-2883 BAM-13786 Chart points with failed builds or no daily dataNULL5
290CLOV-1573BAM-9048 More configuration options for automatic Clover integrationNULL5
291CLOV-1582Test Clover-for-IDEA compatibility with IDEA 14NULL2
292CLOV-1584Add additional logging for <clover-setup>/<files> elementCurrently, when <clover-setup> contains a <fileset> element, Clover prints information about included/excluded files (on a verbose logging level). In <clover-setup> we can also use a similar <files> element - but there's no logging for it. Add logging on a verbose level.1
293CLOV-1585Insert Clover goals between original ones add "clover2:setup" after the "clean" (if present) and before other goals but "jaxb2:generate clover2:setup" but "wsdl2java clover2:setup" 3
294CLOV-1586Add warnings in UI about install/deploy phases what to do in case when "install" or "deploy" phase is declared? deploying instrumented JARs shall be avoided in general write help for "automatically integrate clover" radio button? write warning in UI if such goals are found? write warning in a build log if such goals are found? 3
295CLOV-1587Prepare Bamboo documentation about the change* Write big warning in the Bamboo 5.8 Release Notes what do to with Clover-enabled plans before upgrading * Update "Enabling the Clover add-on" page (how it works for maven in bamboo 5.8 and 5.7) * Update answers.a.c questions about this problem and CLOVERKB too 2
296CLOV-1588Integrate Clover with JUnitParamsThe JUnitParams (https://github.com/Pragmatists/junitparams) is much more convenient way to parameterize tests instead of using JUnit's 4.10 @Parameterized annotation. 5
297CLOV-1595Clover does not work with Grails 2.4.4When developers use "./grailsw run-app" it gives the following error. {noformat} Running Grails application Error Error loading event script from file [/opt/stanson/target/work/plugins/clover-4.0.2/scripts/_Events.groovy] startup failed: /opt/stanson/target/work/plugins/clover-4.0.2/scripts/_Events.groovy: 4: unable to resolve class org.codehaus.groovy.grails.test.GrailsTestTargetPattern @ line 4, column 1. import org.codehaus.groovy.grails.test.GrailsTestTargetPattern ^ 1 error (Use --stacktrace to see the full trace) {noformat}3
298CLOV-1596Use heuristics to solve JDK8 Stream compilation errorsSpike in which a problem with Java8 streams will be attacked as it seems that using stream() is very popular and the most probably it causes the majority of compilation problems with Clover's lambdaInc(). Scope: focus on streams only. Out of scope: attacking a generic problem of method signatures with a mixture of functional and non-functional arguments. 13
299CLOV-1597Set instrumentLambda=none as a default value for instrumentationThis is a temporary workaround thanks to which java8 code will always compile, at the cost that lambdas are not measured. User will be still able to enable lambda instrumentation, but this will be a conscious decision, so seeing compilation errors should be less surprising. Scope: CloverInstr, ant, maven, idea, eclipse, grails plugins.1
300CLOV-1603CloverOptimizedTestNGSelector does not add "clover-optimized" group to TestNG @Before and @After annotationsIn order for Clover to optimize a TestNG test suite, we have to use the {{CloverOptimizedTestNGSelector}} listener, and restrict TestNG to only run the "clover-optimized" group, as in: {code:xml|title=build.xml snippet} <testng groups="clover-optimized" listeners="com.atlassian.clover.ant.tasks.testng.CloverOptimizedTestNGSelector" > <!-- ... --> </testng> {code} The problem with this is that TestNG's {{@Before}} and {{@After}} annotations ({{@BeforeMethod}}, {{@AfterClass}}, etc) will not be run, because they are not part of the "clover-optimized" group. I have a workaround, which is to qualify all such annotations with {{alwaysRun=true}}, but this is pretty ugly. A possible solution is for {{CloverOptimizedTestNGSelector}} to implement {{IAnnotationTransformer2}} and override [transform( IConfigurationAnnotation, Class, Constructor, Method )|http://testng.org/javadoc/org/testng/IAnnotationTransformer2.html#transform%28org.testng.annotations.IConfigurationAnnotation,%20java.lang.Class,%20java.lang.reflect.Constructor,%20java.lang.reflect.Method%29], automatically adding the "clover-optimized" group to all non-tests.1
301CLOV-1605Replace clover.licenseLocation by maven.clover.licenseLocationWhile it's perfectly fine to have a declaration like this: {code:xml} <properties> <clover.licenseLocation>clover.license</clover.licenseLocation> </properties> {code} and next refer it in maven-clover2-plugin's configuration like this: {code:xml} <configuration> <licenseLocation>${clover.licenseLocation}</licenseLocation> </configuration> {code} it's misleading for users, because in case they would like to pass it via -D parameter or declare in settings.xml without having the <licenseLocation> in maven-clover2-plugin section, it will not work, because the correct property name is 'maven.clover.licenseLocation'. See: https://docs.atlassian.com/maven-clover2-plugin/latest/setup-mojo.html#licenseLocation Correct all references in documentation on confluence.atlassian.com, answers.atlassian.com, maven-clover2-plugin source code, tutorial source code. 1
302CLOV-1606Java8: method reference to a non-static method fails to compile{quote} *NOT REPRODUCIBLE* {quote} In this code sample: {code:java} return map.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, e -> e.getValue().getAverage() )); {code} the Collectors.toMap() takes a "Map.Entry::getKey" method reference as input argument. However, the getKey method is not static. Wrapping it by Clover's lambdaInc() method leads to a compilation error like this: {noformat} [javac] symbol: method lambdaInc(int,Map.Entry::getKey,int) [javac] location: class __CLR4_0_22ci2cii4lxhoaj [javac] Foo.java:33: error: invalid method reference [javac] __CLR4_0_22ci2cii4lxhoaj.lambdaInc(3045,Map.Entry::getKey,3046), [javac] ^ [javac] non-static method getKey() cannot be referenced from a static context [javac] where K is a type-variable: [javac] K extends Object declared in interface Entry {noformat} *Possible workarounds ??* 1) Disable instrumentation of expression-like lambda functions (method references are treated as expression-like lambda) - use instrumentLambda="block" or "none". 2) Wrap such method reference with ///CLOVER:OFF and ///CLOVER:ON keywords, e.g.: {code:java} return map.entrySet().stream() .collect(Collectors.toMap( ///CLOVER:OFF Map.Entry::getKey, ///CLOVER:ON e -> e.getValue().getAverage() )); {code} 3) Use a variable with a non-static method reference or change to a lambda expression. {code:java} return map.entrySet().stream() .collect(Collectors.toMap( e -> e.getKey(), // unfortunately IDEA suggests to change it back e -> e.getValue().getAverage() )); {code} 3
303CLOV-1607Java8: don't instrument lambda functions when source < 1.8No matter what "-source" value is set, Clover instruments both expression-like and block-like lambdas. It's a behaviour slightly different from the one we have for e.g.: * -source 1.3 (it handles 'assert' as not a keyword) or * -source 1.4 (no 'enums'). Ways to improve it: 1) change Java grammar so that handling lambda functions is optional - only for source >= 1.8; otherwise Clover should throw a parse error 2) or parse lambdas also for source < 1.8 (no parse errors would be thrown, only javac will raise a compilation error), but do not add Clover's instrumentation to it {code:java} private LambdaBlockEntryEmitter instrEnterLambdaBlock(MethodSignature lambdaSignature, CloverToken leftCurly) { if (cfg.getInstrumentLambda() == LambdaInstrumentation.ALL || cfg.getInstrumentLambda() == LambdaInstrumentation.BLOCK /* add source level check*/ ) { ... {code} 1
304CLOV-1608New colour scheme for a tag cloud and a coverage treemap in the HTML reportCustomers reported that using a single, red color gradient in a coverage tree map and in tag clouds has two drawbacks: * it's harder to find which code areas require improvement * seeing always a red color is discouraging :-) 2
305CLOV-1610Support Groovy 2.4.0 in CloverNULL2
306CLOV-1611Clover doesn't support Spock 1.0 and 1.0-SNAPSHOTIt works with Spock v0.7-groovy-2.0, but it doesn't work with Spock v1.0-groovy-2.0-SNAPSHOT. The root cause is that the IGlobalExtension interface changed and it now has start() and stop() methods, which the v0.7 version did not have, and so an AbstractMethodError: null is thrown: {code} java.lang.AbstractMethodError: null at org.spockframework.runtime.GlobalExtensionRegistry.startGlobalExtensions(GlobalExtensionRegistry.java:105) at org.spockframework.runtime.RunContext.start(RunContext.java:63) at org.spockframework.runtime.RunContext.get(RunContext.java:165) at org.spockframework.runtime.Sputnik.runExtensionsIfNecessary(Sputnik.java:88) at org.spockframework.runtime.Sputnik.run(Sputnik.java:61) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) {code} Because of this, we cannot use the most recent features in Spock, since v0.7 is more than 2 years old.2
307CLOV-1612Clover fails to generate HTML report for more than one project in Eclipse {noformat} Clover Version 4.0.3, built on January 27 2015 (build-dev) Loaded from: D:\Soft\Eclipse\eclipse-4.4-luna\plugins\com.atlassian.clover.eclipse.core_4.0.3.v20150127120908-dev.jar Clover: Developer License registered to Atlassian. [C:/Users/Marek/.workspace-eclipse-4.4/Moneybags/.clover/coverage.db, 0 seconds"C:/Users/Marek/.workspace-eclipse-4.4/javasyntax18/.clover/coverage.db, 0 seconds--report, --testsIncludePattern, C:/Users/Marek/.workspace-eclipse-4.4/Moneybags/**/*Test.java, C:/Users/Marek/.workspace-eclipse-4.4/Moneybags/**/Test*.java, C:/Users/Marek/.workspace-eclipse-4.4/javasyntax18/**/*Test.java, C:/Users/Marek/.workspace-eclipse-4.4/javasyntax18/**/Test*.java--testsExcludePattern, C:/Users/Marek/.workspace-eclipse-4.4/Moneybags/, C:/Users/Marek/.workspace-eclipse-4.4/javasyntax18/, -a, -i, C:\Users\Marek\AppData\Local\Temp\clover3525180172645953949merge, -o, C:\Users\Marek\Desktop, -t, Coverage Report, -tc, 0, -f, , -s, 0 days] Error generating report: java.lang.NumberFormatException java.lang.NumberFormatException java.math.BigDecimal.<init>(BigDecimal.java:459) java.math.BigDecimal.<init>(BigDecimal.java:728) com.atlassian.clover.cfg.Interval.initialise(Interval.java:183) com.atlassian.clover.cfg.Interval.<init>(Interval.java:121) com.atlassian.clover.eclipse.core.reports.MergeReportJob$MergeAndReport.run(MergeReportJob.java:140) com.atlassian.clover.eclipse.core.reports.ForkingReporter.main(ForkingReporter.java:25) {noformat} 1
308CLOV-1613Unable to open generated reports in Eclipse 4.4Steps to reproduce: Open "Coverage Exploer", click "Run new report ..." and create any report. Next click "View report" and select it on a list. Nothing happens in the UI and the "Error log" view shows "Unhandled event exception" entry with a stack trace as follows: {noformat} java.lang.NoClassDefFoundError: Could not initialize class com.atlassian.clover.eclipse.core.reports.OpenReportOperation com.atlassian.clover.eclipse.core.views.actions.GenerateReportAction$2.widgetSelected(GenerateReportAction.java:151) org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248) org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382) org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:236) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) org.eclipse.equinox.launcher.Main.run(Main.java:1465) {noformat} 1
309CLOV-1614Error when closing Cloud Editor in EclipseClosing the "Cloud Editor" in Eclipse causes that sometimes an exception is thrown and reported in the Error Log: {noformat} Error disposing widget for : org.eclipse.e4.ui.model.application.ui.basic.impl.PartImpl Clover Coverage Cloud Report java.lang.NullPointerException org.eclipse.swt.custom.CTabFolderLayout.computeSize(CTabFolderLayout.java:39) org.eclipse.swt.widgets.Composite.computeSize(Composite.java:234) org.eclipse.swt.layout.GridData.computeSize(GridData.java:491) org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:221) org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:197) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1290) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1276) org.eclipse.swt.widgets.Composite.layout(Composite.java:665) org.eclipse.swt.custom.CTabFolder.runUpdate(CTabFolder.java:3755) org.eclipse.swt.custom.CTabItem.getBounds(CTabItem.java:149) org.eclipse.swt.custom.CTabFolder.onPaint(CTabFolder.java:1993) org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:289) org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1491) org.eclipse.swt.widgets.Control.windowProc(Control.java:4667) org.eclipse.swt.widgets.Display.windowProc(Display.java:5036) org.eclipse.swt.internal.win32.OS.VtblCall(Native Method) org.eclipse.swt.internal.ole.win32.IOleInPlaceObject.InPlaceDeactivate(IOleInPlaceObject.java:21) {noformat} and {noformat} Unhandled event loop exception java.lang.NullPointerException org.eclipse.swt.custom.CTabFolderLayout.computeSize(CTabFolderLayout.java:39) org.eclipse.swt.widgets.Composite.computeSize(Composite.java:234) org.eclipse.swt.layout.GridData.computeSize(GridData.java:491) org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:221) org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:197) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1290) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1297) org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1276) org.eclipse.swt.widgets.Composite.setLayoutDeferred(Composite.java:1087) org.eclipse.swt.widgets.Display.runDeferredLayouts(Display.java:4196) org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) {noformat} Apparently, it fails in the CTabFolderLayout.computeSize() method: {code:java} protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { CTabFolder folder = (CTabFolder)composite; CTabFolderRenderer renderer = folder.renderer; ... tabW = Math.max(tabW, renderer.computeSize(width, 2, gc, -1, -1).x); {code} the 'renderer' is null. This renderer is being set in CTabFolder.init() method and set to null in the CTabFolder.onDispose() method. It *may* be related with the: CloudEditor.dispose() which calls removeCoverageChangeListener after the super.dispose() so a refresh event may come in the meantinme or CloudEditor.createPages() which "hacks" the container layout by changing it from FillLayout to GridLayout.3
310CLOV-1617Automatic Clover integration does not work for <groovyc> task*Problem:* Automatic Clover integration in Bamboo does now work for Ant Tasks containing the <groovyc> task. *Root cause:* When automatic Clover integration is enabled in Bamboo, it uses Clover's AntIntegrationListener: {noformat} ant ... -lib clover.jar -listener com.atlassian.clover.ci.AntIntegrationListener {noformat} This listener listens to Ant's build events and intercepts Ant tasks such as: <javac>, <java>, <javadoc>, <junit> However, it does not intercept the <groovyc> one. Integration with <groovyc> task is performed by the <clover-setup> task, which calls: {code:java} GroovycSupport.ensureAddedTo(antProject); {code} Note that GroovycSupport implements Ant's BuildListener. However, it cannot be passed via command line, like this: {noformat} ant ... -lib clover.jar -listener com.atlassian.clover.ant.groovy.GroovycSupport {noformat} because the GroovycSupport does not have a default constructor. *Workaround:* Call the <clover-setup> from an Ant script. For example, add the following target: {code:xml} <target name="instrument" if="with.clover"> <!-- we assume that automatic integration is enabled, which adds the '-lib clover.jar' --> <taskdef name="clover-setup" classname="com.atlassian.clover.ant.tasks.CloverSetupTask"/> <!-- from the clover.jar --> <!-- call clover-setup to intercept <groovyc> task --> <clover-setup/> <!-- This fake compilation is to cheat the automatic Clover integration, so that it won't display the "Clover reports not being generated. No Clover instrumentation was done." error message. We instrument java sources, but through the <groovyc> task; and we need to trick Clover so that it generates an HTML report at the end. --> <mkdir dir="${target.classes}"/> <javac failonerror="false" srcdir="${src.java}" excludes="**/*" destdir="${target.classes}"/> </target> <target name="compile" depends="instrument"> <groovyc destdir="${target.classes}" classpathref="build.classpath" fork="yes"> <javac source="1.7" target="1.7" debug="on" encoding="UTF8"> </javac> <src path="${src.java}"/> <src path="${src.groovy}"/> </groovyc> </target> {code} Clover's initialization will occur only if '-Dwith.clover=true' is set. Therefore, modify the Ant Task in Bamboo, for instance: {noformat} clean test -Dwith.clover=true {noformat} *Possible fixes:* 1) Add default constructor for GroovycSupport. Pass it as a second '-listener' to ant command in Bamboo. 2) Change the AntIntegrationListener so that it will intercept all <groovyc> tasks as well. 5
311CLOV-1632Protect against deployment of instrumented codeIf user calls "mvn clover2:setup install" or "mvn clover2:setup deploy", code instrumented by Clover will be installed to ~/.m2 or deployed to a repository. This may be not a desired behavior, especially if developer is not aware of it (for instance if someone switches on the automatic Clover integration in Bamboo). Furthermore, installation may occur not only for "install" or "deploy" phases expressed explicitly in the command line, but it can also happen when a plug-in runs such life cycle (mvn release:perform for instance). Implement a protection against it - in the clover2:setup check the reactor which phases are about to run and refuse code instrumentation if 'install' or 'deploy' will be called. This protection shall not be enabled by default, because there may be actually a need to install instrumented code (for instance - multiple build plans using the same local m2 cache or repository to fetch compiled artifacts and we want to measure coverage for all modules). Enable protection by a flag. e.g. {code:xml} <configuration> <repositoryPollutionProtection>true</repositoryPollutionProtection> </configuration> {code} mvn -Dmaven.clover.repositoryPollutionProtection=true Expected behavior: fail a build if repositoryPollutionProtection=true and build lifecycle contains 'install' or 'deploy' phases. *Extra:* Fail also if artifact contains a custom classifier and clover2:instrument is used (as Maven cannot handle an artifact with two classifiers).3
312CLOV-1644Set up developmment environment for Stashprobably on Linux VM2
313CLOV-1654as a plugin developer I'd like to have annotations for a package in a Clover databaseCurrently, annotations are available for classes and methods only: * ClassInfo.getModifiers().getAnnotations() * MethodInfo.getSignature().getAnnotations() There's nothing like PackageInfo.getAnnotations(). The reason to have this is that _package-info.java_ files may contain annotations (but no executable code). While having this adds no value for Clover instrumentation itself, it could be useful for plugin developers, who would like to read Clover database directly. For instance, this information could be used to filter classes based on the information stored on a package level. See: https://answers.atlassian.com/questions/12781852/how-to-read-package-annotations-from-clover-db 5
314CLOV-1657Compiling Groovy code with Clover throws NPEClover fails to integrate with Groovyc task and throws NPE: {noformat} Clover failed to integrate with <groovyc/> java.lang.NullPointerException at com.atlassian.clover.ant.groovy.GroovycSupport.buildTestDetector(GroovycSupport.java:242) at com.atlassian.clover.ant.groovy.GroovycSupport.taskStarted(GroovycSupport.java:141) at org.apache.tools.ant.Project.fireTaskStarted(Project.java:2184) at org.apache.tools.ant.Task.perform(Task.java:344) at org.apache.tools.ant.Target.execute(Target.java:392) at org.apache.tools.ant.Target.performTasks(Target.java:413) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) ... {noformat} *Cause:* NPE is thrown when Clover cannot find it's AntInstrumentationConfig in project references in an Ant-based build. This can happen when a build calls <ant> or <antcall> tasks without {{inheritrefs=true}} - lack of this property causes that AntInstrumentationConfig is not passed to these calls. *Workaround:* Ensure that {{inheritrefs=true}} is used. 1
315CLOV-1658Publish Clover-for-Scala prototypeTasks: * request releasing it as open source * publish plugin's source code on BitBucket, * prepare and publish documentation on CAC/Clover-for-Scala. * prepare plug-in developer documentation5
316CLOV-1659as a user I want to use Clover with maven-scala-pluginIntegration of Clover-for-Scala with the maven-scala-plugin. Tasks: * clover2:setup shall "connect" to the maven-scala-plugin; t.b.d. how - META-INF/services? a plugin point? some properties? * clover2:clover shall include also *.scala sources Checks: * is it possible to have joint Scala-Java compilation (like with joint Groovy-Java)? Out of scope: * clover2:instr is out of scope as integration is performed using AST, not source code * clover2:optimize as test optimization is in another task 13
317CLOV-1660as a user I want to use Clover with scalac Integration of Clover-for-Scala with scalac command line tool. Tasks: * shall be easy - plugging via META-INF/services Checks: * is it possible to have joint Scala-Java compilation? if yes, then how it works and how to intercept both compilers? 5
318CLOV-1661as a user I want to use Clover with SBTIntegration of Clover-for-Scala with SBT. Tasks: * write build plugin for SBT - equivalent of clover2:setup, shall intercept any scalac calls; shall add clover.jar (clover-scala.jar?) to class paths for compilation and runtime * write build plugin for SBT - equivalent of clover2:clover, shall generate reports; we may call Clover-for-Ant under the hood 20
319CLOV-1662as a user I want to see nested functions in reportsScala allows to nest functions inside other functions. Enhance existing HTML / XML / JSON reports in such way that we could see such nesting as well. Some of the required functionality has already been done during implementation of lambda functions for Java 8 (Clover 3.2). Review if all possible nesting combinations are implemented in Velocity templates (method-in-method, class-in-method etc). Affects: table with list of methods for a class, calculation of metrics etc.5
320CLOV-1663as a user I want to see for Scala exact code coverage highlighting in an HTML reportAs in Scala we may have a lot of statements in a single source line, it would be very valuable to have coverage highlighting not for a single line, but for a single character in HTML reports. Similarly as we have for Eclipse and IDEA. See this issue: 8
321CLOV-1664as a user I want to use Clover-for-Scala in IntelliJ IDEATasks: * integrate with Scala complier in IDEA (using external build process) * show Scala classes in Cloverage view * show coverage highlighting in Scala editors (!) Challenge: simultaneous update of clover.db by Javac and Scalac (similar problem as for Groovy in IDE) Out of scope: * test optimization for Scala40
322CLOV-1665as a user I want to use Clover-for-Scala in EclipseIntegration of Clover-for-Scala with Eclipse. Tasks: * plug into *.scala text editors * show scala classes in the 'Coverage Explorer' * intercept compilation of Scala code (!) Challenge: simultaneous updates of clover.db by Scalac and Javac (similarly as for Groovy in IDE) Out of scope: * test optimization for Scala40
323CLOV-1666as a user I want to run test optimization for Scala testsIt should be possible to perform test optimization for Scala test classes. Integrations: * Ant (?) * Maven * SBT * IDEA (?) * Eclipse (?) 40
324CLOV-1667as a user I want to see smart names for classes and functions in reportsThe point is that Scala code is being translated to a bytecode containing various "cryptic" names. For instance, "overloaded operators" have "$op" in method's name. Think how to reasonably represent methods, functions, inline classes, anonymous functions, case classes, traits etc etc in HTML report at least (XML / JSON are less important). 20
325CLOV-1668Clover installs instrumented-jars in local Maven repo, in place of non-instrument onesI'm not sure if this has been reintroduced or something else is wrong, since the CLOVKB claims it is not the case: https://confluence.atlassian.com/display/CLOVERKB/Maven+is+deploying+instrumented+jars (I _am_ using the {{instrument}} goal - followed by {{log}} and {{check}}) In the below, you can see that, e.g., {{target/clover/magnolia-module-diff-1.7-SNAPSHOT-clover-tests.jar}} gets copied to {{.../magnolia-module-diff-1.7-SNAPSHOT-tests.jar}} (without {{-clover}} qualifier!) This seems to happen for ~all artifacts except the "main" jar. (test jar, assemblies, etc..). In this case, the situation is saved by the "real" install plugin that gets executed later and overwrites those wrong artifacts. However, if we use the (newish) {{installAtEnd}} feature of the {{maven-install-plugin}}, then this doesn't happen, and we end up with instrumented jars in place of the non-instrumented ones, which has tons of ugly consequences. See for yourself with the snippet:{code:xml} <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <configuration> <installAtEnd>false</installAtEnd> </configuration> </plugin> </plugins> </pluginManagement> </build> {code} Why is Clover installing anything, anyway ? Shouldn't it just _attach_ the instrumented jars (and only those) to the build, and let Maven do the rest ? {noformat} [INFO] --- maven-clover2-plugin:4.0.2:check (instrument-and-check) @ magnolia-module-diff --- [INFO] [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ magnolia-module-diff --- [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/clover/magnolia-module-diff-1.7-SNAPSHOT-clover.jar to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-clover.jar [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/pom.xml to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT.pom [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT-bundle.zip to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-bundle.zip [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT-bundle.tar.gz to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-bundle.tar.gz [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT-tests.jar to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-tests.jar [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/clover/magnolia-module-diff-1.7-SNAPSHOT-clover-bundle.zip to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-bundle.zip [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/clover/magnolia-module-diff-1.7-SNAPSHOT-clover-bundle.tar.gz to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-bundle.tar.gz [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/clover/magnolia-module-diff-1.7-SNAPSHOT-clover-tests.jar to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-tests.jar [INFO] [INFO] <<< maven-clover2-plugin:4.0.2:instrument (instrument-and-check) < [clover]install @ magnolia-module-diff <<< [INFO] [INFO] --- maven-clover2-plugin:4.0.2:instrument (instrument-and-check) @ magnolia-module-diff --- [INFO] [INFO] --- maven-clover2-plugin:4.0.2:log (instrument-and-check) @ magnolia-module-diff --- [INFO] Clover Version 4.0.2, built on October 13 2014 (build-943) [...] [INFO] Coverage check PASSED [INFO] [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ magnolia-module-diff --- [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT.jar to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT.jar [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/pom.xml to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT.pom [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT-bundle.zip to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-bundle.zip [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT-bundle.tar.gz to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-bundle.tar.gz [INFO] Installing /Users/gjoseph/Dev/magnolia/git/enterprise/diff/target/magnolia-module-diff-1.7-SNAPSHOT-tests.jar to /Users/gjoseph/.m2/repository/info/magnolia/magnolia-module-diff/1.7-SNAPSHOT/magnolia-module-diff-1.7-SNAPSHOT-tests.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ {noformat}1
326CLOV-1672Ensure that Clover JAR is readable by Ant 1.9.0-1.9.1Ant 1.9.0/1.9.1 have a bug related with zip64 file handling: _central directory zip64 extended information extra field's length doesn't match central directory data. Expected length 0 but is 16_ While this bug has been fixed in Ant 1.9.2, it should be still possible to produce such Clover JAR file that it will be readable by buggy Ant versions as well. Ensure that new Clover 4.0.5 (and further versions) will be compatible.3
327CLOV-1675Grails Clover Plugin compatibility with Grails 2.4.5, 2.5.0New Grails versions have been released recently: * 2.4.5 24/Mar/15 * 2.5 24/Mar/15 Make Grails Clover Plugin compatible with them.5
328CLOV-1679MavenIntegrator shall not add arguments if they are already present in original commandThis applies to: * build phases * Clover's properties Current problems: 1) The "clean" phase can be doubled For example if original command has: {noformat} mvn clean test {noformat} it becomes: {noformat} mvn clean clean clover2:setup test clover2:aggregate clover2:clover ... {noformat} 2) User cannot override default values of Clover properties For example if a property is already defined: {noformat} mvn test -Dmaven.clover.licenseLocation=/my/clover.license {noformat} MavenIntegrator adds a second one with it's own value: {noformat} mvn test -Dmaven.clover.licenseLocation=/my/clover.license -Dmaven.clover.licenseLocation=/tmp/clover.license {noformat} 1
329CLOV-1682Repository pollution protection reports a custom classifier under Maven 2.2.x*Problem:* Probably bug in Maven, needs further investigation. Running "clean clover2:instrument" on a simple project (no additional plugins) with repository pollution protection enabled causes a build failure. {noformat} maven-clover2-plugin-hg\src\it\pollutionProtection>mvn clean clover2:instrument -Dmaven.clover.repositoryPollutionProtection=true [INFO] Scanning for projects... [INFO] snapshot com.atlassian.maven.plugins:maven-clover2-plugin:4.0.4-SNAPSHOT: checking for updates from atlassian-internal [INFO] ------------------------------------------------------------------------ [INFO] Building Unnamed - com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT [INFO] task-segment: [clean, clover2:instrument] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean {execution: default-clean}] [INFO] Deleting directory f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target [INFO] Preparing clover2:instrument [INFO] snapshot com.atlassian.clover:clover:4.0.4-SNAPSHOT: checking for updates from atlassian-internal [INFO] [clover2:instrumentInternal {execution: default-instrumentInternal}] [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Clover's repository pollution protection is enabled. Your build produces an artifact (com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:tests:1.0-SNAPSHOT) with a custom classi fier. As Maven does not support multiple classifiers for an artifact, appending second 'clover' classifier may not be handled correctly. You can: - remove a custom classifier or - configure Clover to not append the '-clover' classifier to fix it. You can also disable pollution protection (-Dmaven.clover.repositoryPollutionProtection=false) if you know that it doesn't affect your build. {noformat} Adding extra logging showed that it fails because a custom 'tests' classifier is used during a build - see XXXXXXXXXX below. {noformat} maven-clover2-plugin-hg\src\it\pollutionProtection>mvn clean clover2:instrument [INFO] Scanning for projects... [INFO] snapshot com.atlassian.maven.plugins:maven-clover2-plugin:4.0.4-SNAPSHOT: checking for updates from atlassian-internal [INFO] ------------------------------------------------------------------------ [INFO] Building Unnamed - com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT [INFO] task-segment: [clean, clover2:instrument] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean {execution: default-clean}] [INFO] Preparing clover2:instrument [INFO] snapshot com.atlassian.clover:clover:4.0.4-SNAPSHOT: checking for updates from atlassian-internal [INFO] [clover2:instrumentInternal {execution: default-instrumentInternal}] [INFO] XXXXXXXXXX CLASSIFIER= com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:tests:1.0-SNAPSHOT [INFO] Clover Version 4.0.4, built on April 15 2015 (build-dev) [INFO] Loaded from: d:\Data\.m2\repository\com\atlassian\clover\clover\4.0.4-SNAPSHOT\clover-4.0.4-SNAPSHOT.jar [INFO] Clover: Developer License registered to Atlassian. [INFO] Creating new database at 'f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\clover.db'. [INFO] Processing files at 1.8 source level. [INFO] Clover all over. Instrumented 1 file (1 package). [INFO] Elapsed time = 0,077 secs. (12,987 files/sec, 64,935 srclines/sec) [INFO] Clover Version 4.0.4, built on April 15 2015 (build-dev) [INFO] Loaded from: d:\Data\.m2\repository\com\atlassian\clover\clover\4.0.4-SNAPSHOT\clover-4.0.4-SNAPSHOT.jar [INFO] Clover: Developer License registered to Atlassian. [INFO] Updating existing database at 'f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\clover.db'. [INFO] Processing files at 1.8 source level. [INFO] Clover all over. Instrumented 1 file (1 package). [INFO] 1 test method detected. [INFO] Elapsed time = 0,016 secs. (62,5 files/sec, 562,5 srclines/sec) [INFO] [resources:resources {execution: default-resources}] [WARNING] Using platform encoding (Cp1250 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\src\main\resources [INFO] Copying 1 resource [INFO] [compiler:compile {execution: default-compile}] [INFO] Compiling 1 source file to f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\classes [INFO] [resources:testResources {execution: default-testResources}] [WARNING] Using platform encoding (Cp1250 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\src\test\resources [INFO] [compiler:testCompile {execution: default-testCompile}] [INFO] Compiling 1 source file to f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\test-classes [INFO] [surefire:test {execution: default-test}] [INFO] Surefire report directory: f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running ATest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.168 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\clover-pollution-protection-1.0-SNAPSHOT-clover.jar [INFO] [install:install {execution: default-install}] [INFO] Installing f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\clover-pollution-protection-1.0-SNAPSHOT-clover.jar to d:\Data\.m2\repository\com\atlassian\maven\plugins\sam ple\clover-pollution-protection\1.0-SNAPSHOT\clover-pollution-protection-1.0-SNAPSHOT-clover.jar [INFO] [clover2:instrument {execution: default-cli}] [INFO] XXXXXXXXXX CLASSIFIER= com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ {noformat} What's interesting, running the same test but with clover2:setup not only does not fails a build (because repository pollution protection does not fail due to custom classifier if no 'clover' is used), but the artifact produced does NOT have the 'tests' classifier: {noformat} maven-clover2-plugin-hg\src\it\pollutionProtection>mvn clean clover2:setup verify [INFO] Scanning for projects... [INFO] snapshot com.atlassian.maven.plugins:maven-clover2-plugin:4.0.4-SNAPSHOT: checking for updates from atlassian-internal [INFO] ------------------------------------------------------------------------ [INFO] Building Unnamed - com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT [INFO] task-segment: [clean, clover2:setup, verify] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean {execution: default-clean}] [INFO] Deleting directory f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target [INFO] snapshot com.atlassian.clover:clover:4.0.4-SNAPSHOT: checking for updates from atlassian-internal [INFO] [clover2:setup {execution: default-cli}] [INFO] XXXXXXXXXX CLASSIFIER= com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT [INFO] Clover Version 4.0.4, built on April 15 2015 (build-dev) [INFO] Loaded from: d:\Data\.m2\repository\com\atlassian\clover\clover\4.0.4-SNAPSHOT\clover-4.0.4-SNAPSHOT.jar [INFO] Clover: Developer License registered to Atlassian. [INFO] Creating new database at 'f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\clover.db'. [INFO] Processing files at 1.8 source level. [INFO] Clover all over. Instrumented 1 file (1 package). [INFO] Elapsed time = 0,057 secs. (17,544 files/sec, 87,719 srclines/sec) [INFO] Clover Version 4.0.4, built on April 15 2015 (build-dev) [INFO] Loaded from: d:\Data\.m2\repository\com\atlassian\clover\clover\4.0.4-SNAPSHOT\clover-4.0.4-SNAPSHOT.jar [INFO] Clover: Developer License registered to Atlassian. [INFO] Updating existing database at 'f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover\clover.db'. [INFO] Processing files at 1.8 source level. [INFO] Clover all over. Instrumented 1 file (1 package). [INFO] 1 test method detected. [INFO] Elapsed time = 0,011 secs. (90,909 files/sec, 818,182 srclines/sec) [INFO] [resources:resources {execution: default-resources}] [WARNING] Using platform encoding (Cp1250 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\src\main\resources [INFO] Copying 1 resource [INFO] [compiler:compile {execution: default-compile}] [INFO] Compiling 1 source file to f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\classes [INFO] [resources:testResources {execution: default-testResources}] [WARNING] Using platform encoding (Cp1250 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\src\test\resources [INFO] [compiler:testCompile {execution: default-testCompile}] [INFO] Compiling 1 source file to f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\test-classes [INFO] [surefire:test {execution: default-test}] [INFO] Surefire report directory: f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running ATest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.155 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: f:\Work\maven-clover2-plugin-hg\src\it\pollutionProtection\target\clover-pollution-protection-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ {noformat} It affects Maven 2.2.x. Does not occur in Maven 2.1.x or Maven 3.x. Summarizing, it seems that forking a parallel build life cycle causes that an artefact's classifier changes from empty to 'tests': * with clover2:instrument: {noformat} [INFO] [clover2:instrumentInternal {execution: default-instrumentInternal}] [INFO] XXXXXXXXXX CLASSIFIER= com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:tests:1.0-SNAPSHOT ... [INFO] [clover2:instrument {execution: default-cli}] [INFO] XXXXXXXXXX CLASSIFIER= com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT {noformat} * with clover2:setup: {noformat} [INFO] [clover2:setup {execution: default-cli}] [INFO] XXXXXXXXXX CLASSIFIER= com.atlassian.maven.plugins.sample:clover-pollution-protection:jar:1.0-SNAPSHOT {noformat} *Workaround:* * use clover2:setup instead of clover2:instrument to avoid forking life cycle or * use different Maven version or * disable the protection 3
330CLOV-1683Grails Clover Plugin compatibility with Grails 3.xGrails 3 has been released (3.0 GA on 31/Mar/15). It uses the Gradle build tool instead of Gant, thus we may need to have Gradle support as well. It has also various changes in API. Implement support for Grails 3 in the Grails Clover Plugin. 5
331CLOV-1743OutOfMemoryError while flushing coverage data {noformat} 29-May-2015 12:53:08 ERROR: java.lang.OutOfMemoryError flushing coverage for recorder /media/ephemeral0/bamboo-working-dir/BAM-CLOVER344-UT/components/bamboo-core/target/clover/clover.dbbjv36u_ia9lwdsf: Java heap space 29-May-2015 12:53:08 Exception in thread "CloverFlushThread" java.lang.OutOfMemoryError: Java heap space 29-May-2015 12:53:08 at java.util.zip.DeflaterOutputStream.<init>(DeflaterOutputStream.java:56) 29-May-2015 12:53:08 at com.cenqua.clover.util.FileUtils.createDeflateOutputStream(FileUtils.java:468) 29-May-2015 12:53:08 at com.cenqua.clover.FileBasedGlobalCoverageRecording.write(FileBasedGlobalCoverageRecording.java:39) 29-May-2015 12:53:08 at com.cenqua.clover.GlobalRecordingWriteStrategy$1.write(GlobalRecordingWriteStrategy.java:9) 29-May-2015 12:53:08 at com.cenqua.clover.BaseCoverageRecorder.write(BaseCoverageRecorder.java:108) 29-May-2015 12:53:08 at com.cenqua.clover.FixedSizeCoverageRecorder.write(FixedSizeCoverageRecorder.java:56) 29-May-2015 12:53:08 at com.cenqua.clover.BaseCoverageRecorder.flush(BaseCoverageRecorder.java:302) 29-May-2015 12:53:08 at com.cenqua.clover.BaseCoverageRecorder.flush(BaseCoverageRecorder.java:271) 29-May-2015 12:53:08 at com.cenqua.clover.BaseCoverageRecorder$CloverFlushThread.run(BaseCoverageRecorder.java:155) 29-May-2015 12:55:48 ERROR: java.lang.OutOfMemoryError flushing coverage for recorder /media/ephemeral0/bamboo-working-dir/BAM-CLOVER344-UT/components/bamboo-core/target/clover/clover.dbdozy2b_ia9lwcia: Java heap space 29-May-2015 12:55:48 Exception in thread "CloverFlushThread" java.lang.OutOfMemoryError: Java heap space 29-May-2015 12:56:03 ERROR: java.lang.OutOfMemoryError flushing coverage for recorder /media/ephemeral0/bamboo-working-dir/BAM-CLOVER344-UT/components/bamboo-api/target/clover/clover.dbjcsfjm_ia9lwcij: Java heap space 29-May-2015 12:56:03 Exception in thread "CloverFlushThread" java.lang.OutOfMemoryError: Java heap space {noformat} 2
332CLOV-1752Drop support for IDEA versions older than 11.0.0NULL2
333CLOV-1757Make Clover compatible with IntelliJ 15NULL8
334CLOV-1758Support JDK9 by Clover* As per https://adtmag.com/articles/2015/05/08/oracle-java.aspx we can expect to have the "feature complete" version before December, 2015. Clover should be ready till then.20
335CLOV-1761Add support for Eclipse Mars 4.5 versionAdd support for new Eclipse Mars (June 2015) https://adtmag.com/articles/2015/06/30/eclipse-release-train.aspx1
336CLOV-1766Eclipse Mars 4.5 does not load platform:/ resources properlyClover uses "platform:/" URIs to load standard Eclipse icons from eclipse-core such as a package icon, a folder icon etc. Eclipse Mars is buggy and does not always fetch these resources, as a consequence we don't see proper icons on a toolbar. Fix: bundle new icons in Clover-for-Eclipse plugin and replace "platform:/" references by new icons using local URIs. Note: try aligning look of new icons with ADG and Clover's HTML reports.2
337CLOV-1771AspectJ spikeNULL3
338CLOV-1775Rename maven-clover2-plugin artifactId to clover-maven-plugin{panel:title=Decision|titleBGColor=#205081|bgColor=#59afe1} We are currently working on renaming Maven Clover2 Plugin according to the naming convention recommended by the Apache Maven project. Due to a fact that this is a major breaking change, forcing customers to modify their POMs, CI build plans etc, it will be done in the nearest major Clover release (currently planned for end of 2015) and appropriate migration guides will be prepared. New plugin name will be: *clover-maven-plugin* {panel} *Problem reported:* According the Maven's Plugin Naming Convention, Clover's plugin artifactID violates the Apache Maven Trademark. The artifactId should be clover2-maven-plugin. I would even suggest removing the 2 from the artifactId. [Plugin Naming Convention and Apache Maven Trademark|https://maven.apache.org/guides/plugin/guide-java-plugin-development.html] *Scope of the change:* _Before release_ (/) investigate if we can use clover-maven-plugin or must use cloverX-maven-plugin - _will be renamed to clover-maven-plugin_ (/) decide if major Clover release will be numbered 4.1.0 -or 5.0.0- (as per [Semantic Versioning|http://semver.org]) (/) prepare migration message in maven-clover2-plugin pom.xml for versions 4.0.x, similarly as it was done for Clover Core (com.cenqua.clover:clover:3.3.0) - _message added in pom in 4.0.6_ (/) rename maven-clover2-plugin artifactId for 4.1.0 / -5.0.0- , update integration tests (/) prepare migration guide for Clover 4.1 / -5.0- Release Notes (/) update Clover's Tutorial (Moneybags bundled in clover-ant.zip) -> see also CLOV-1827 _After release_ See CLOV-1828.3
339CLOV-1776Instrumentation error on certain projects since 4.0.5 build of Clover. Instrumentation error on certain projects since 4.0.5 build of Clover. Making it a blocker as we can't run Clover on certain projects any longer. {code} build 27-Jul-2015 13:46:14 [INFO] Processing files at 1.8 source level. build 27-Jul-2015 13:46:17 [INFO] Instrumentation error build 27-Jul-2015 13:46:17 java.util.NoSuchElementException build 27-Jul-2015 13:46:17 java.util.ArrayDeque.getFirst(ArrayDeque.java:324) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.headIdentifiersStack(JavaRecognizer.java:113) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.pushIdentifierToHeadStack(JavaRecognizer.java:109) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.primaryExpressionPart(JavaRecognizer.java:3368) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.postfixExpression(JavaRecognizer.java:5047) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.unaryExpressionNotPlusMinus(JavaRecognizer.java:5007) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.unaryExpression(JavaRecognizer.java:4867) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.multiplicativeExpression(JavaRecognizer.java:4817) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.additiveExpression(JavaRecognizer.java:4787) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.shiftExpression(JavaRecognizer.java:4754) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.relationalExpression(JavaRecognizer.java:4706) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.equalityExpression(JavaRecognizer.java:4673) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.andExpression(JavaRecognizer.java:4654) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.exclusiveOrExpression(JavaRecognizer.java:4635) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.inclusiveOrExpression(JavaRecognizer.java:4616) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.logicalAndExpression(JavaRecognizer.java:4597) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.logicalOrExpression(JavaRecognizer.java:4578) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.conditionalExpression(JavaRecognizer.java:4549) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.conditionalExpression2(JavaRecognizer.java:5558) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.annMemberValue2(JavaRecognizer.java:5528) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.annMemberValuePair(JavaRecognizer.java:5465) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.annotation2(JavaRecognizer.java:1509) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.annotation(JavaRecognizer.java:667) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.packageDefinition(JavaRecognizer.java:593) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.JavaRecognizer.compilationUnit(JavaRecognizer.java:540) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.Instrumenter.instrument(Instrumenter.java:212) build 27-Jul-2015 13:46:17 com.atlassian.clover.instr.java.Instrumenter.instrument(Instrumenter.java:125) build 27-Jul-2015 13:46:17 com.atlassian.clover.CloverInstr.execute(CloverInstr.java:76) build 27-Jul-2015 13:46:17 com.atlassian.clover.CloverInstr.mainImpl(CloverInstr.java:54) build 27-Jul-2015 13:46:17 com.atlassian.maven.plugin.clover.internal.instrumentation.AbstractInstrumenter.instrumentSources(AbstractInstrumenter.java:197) build 27-Jul-2015 13:46:17 com.atlassian.maven.plugin.clover.internal.instrumentation.AbstractInstrumenter.instrument(AbstractInstrumenter.java:72) build 27-Jul-2015 13:46:17 com.atlassian.maven.plugin.clover.CloverInstrumentInternalMojo.execute(CloverInstrumentInternalMojo.java:289) build 27-Jul-2015 13:46:17 com.atlassian.maven.plugin.clover.CloverSetupMojo.execute(CloverSetupMojo.java:31) build 27-Jul-2015 13:46:17 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) build 27-Jul-2015 13:46:17 org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) build 27-Jul-2015 13:46:17 org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347) build 27-Jul-2015 13:46:17 org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154) build 27-Jul-2015 13:46:17 org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) build 27-Jul-2015 13:46:17 org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213) build 27-Jul-2015 13:46:17 org.apache.maven.cli.MavenCli.main(MavenCli.java:157) build 27-Jul-2015 13:46:17 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) build 27-Jul-2015 13:46:17 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) build 27-Jul-2015 13:46:17 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) build 27-Jul-2015 13:46:17 java.lang.reflect.Method.invoke(Method.java:483) build 27-Jul-2015 13:46:17 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) build 27-Jul-2015 13:46:17 org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) build 27-Jul-2015 13:46:17 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) build 27-Jul-2015 13:46:17 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) build 27-Jul-2015 13:46:17 [INFO] {code}2
340CLOV-1779Groovy code with Generics throw NPEsStarting with Clover version 4.0.1 when running JUnit tests against clover instrumented code I am getting a null pointer exception when attempting to call this method: {code:java} // in DateUtil.groovy static <T extends Date> T copy(T date) { (T) date?.clone() } {code} It seems like something has changed with the instrumentation. Either of these two other variations of this same code *doesn't* have this problem: {code:java} static Date copy(Date date) { date?.clone() } static def copy(def date) { date?.clone() } {code} Here's the top of the stacktrace: {noformat} java.lang.NullPointerException com.sun.beans.TypeResolver.resolve(TypeResolver.java:203) com.sun.beans.TypeResolver.resolve(TypeResolver.java:218) com.sun.beans.TypeResolver.resolveInClass(TypeResolver.java:96) java.beans.FeatureDescriptor.getParameterTypes(FeatureDescriptor.java:387) java.beans.MethodDescriptor.setMethod(MethodDescriptor.java:116) java.beans.MethodDescriptor.<init>(MethodDescriptor.java:72) java.beans.MethodDescriptor.<init>(MethodDescriptor.java:56) java.beans.Introspector.getTargetMethodInfo(Introspector.java:1205) java.beans.Introspector.getBeanInfo(Introspector.java:426) java.beans.Introspector.getBeanInfo(Introspector.java:173) groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:3244) java.security.AccessController.doPrivileged(Native Method) groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3242) groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3225) org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:222) org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:253) org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:255) org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:859) org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:72) org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:159) org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) com.surescripts.common.DateUtilTest.clone_NonNullValue(DateUtilTest.groovy:16) {noformat}3
341CLOV-1780Add migration message in maven-clover2-plugin POM(/) investigate if we can use clover-maven-plugin or must use cloverX-maven-plugin -> it would be great to have just clover- instead of cloverX- to avoid changing a number in future (?) decide if major Clover release will be numbered 4.1.0 or 5.0.0 (as per Semantic Versioning) -> it may affect whether it will be named clover4- or clover-5 (/) prepare migration message in maven-clover2-plugin pom.xml for versions 4.0.x, similarly as it was done for Clover Core (com.cenqua.clover:clover:3.3.0) -> deliver in Clover 4.0.6, 4.0.7, ... to be considered: (x) prepare a fork of the plugin and release under two names since 4.0.6? (x) add an extra migration warning printed by the clover2:setup / clover2:instr goal?2
342CLOV-1784Extend interfaces to manipulate test optimizationInterface to manipulate test optimization: * to reorganize optimized test sets * to manipulate content the test optimization snapshot file2
343CLOV-1785Extend database format to handle statements and methods in a fileAllow better modelling of file-level statements and methods so that we can better support languages like Ruby which support top-level scripting constructs. Example: {code:java} session.enterFile(..); session.enterMethod(...); // top-level-method, not inside a class ... // some statements ... session.exitMethod(); ... session.addStatement(...); // top-level-statement, not inside a class or a method ... session.exitFile(); {code} Some preparation have been already done for Java 8 (Clover 3.2). Things to be checked: * how our code calculates the start/end line/col range for a statement/method outside a class * how it calculates code metrics for a file having top-level statements/methods * how it handles exclusion filters (statement/method regexp) * how it handles nested entities (method-in-method etc) Things to be implemented: * take into account these top-level statements/methods in reporting ** show in XML / HTML / PDF / JSON ** render lines ** show in tables etc Out of scope: * test optimization Note: Looking at how Clojure is written, for any Clojure file there would only ever be one FileInfo containing lots of StatementInfos and MethodInfos but no ClassInfos.3
344CLOV-1787Rename ClassInfo to TypeInfoClassInfo is just OK for Java and Groovy (we have classes). But we also have enums, interfaces and annotations! And in other languages we also have closures (Groovy), traits (Groovy, Scala) etc. Thus the name ClassInfo does not suit well for other languages. Rename ClassInfo to something better. TypeInfo might be better.1
345CLOV-1788Make session.enterClass() more language-independentClean up InstrumentationSession.enterClass(..., boolean isInterface, boolean isEnum, boolean isAnnotation) so that it instead takes a LanguageConstruct to indicated what it is which is then embedded in ClassInfo. This divorces this part of the API from Java allowing us to model languages like Scala who have things like traits, singleton objects, etc. This may require a separate LanguageConstruct-like type (TypeConstruct ?) as it will likely need to be smarter than LanguageConstruct and be able to answer some basic questions Clover may need to ask e.g. {code:java} if (!typeInfo.getConstruct().isAbstract(typeInfo)) { //Java interfaces and annotations are always abstract, Scala trait is sometimes abstract, ... //include in the report } {code} The example above is a bit fake because surely we could determine if a TypeInfo is abstract by traversing it but there may be situations where we need to ask similar questions. 3
346CLOV-1789Add possibility to add custom properties for code elementsIntroduce a base interface to ClassInfo, MethodInfo, PackageInfo, FileInfo, StatementInfo, BranchInfo which allows API clients to add arbitrary properties to the model. They values should be raw types, possible Serializable objects too. This should allow instrumentation providers better answer questions Clover may have about the model they've produced. Something like: interface CustomInfo - getProperties(): Map<String, Object> - setProperty(String, Object) - getProperty(String) interface FileInfo extends ..., CustomInfo interface TypeInfo extends ..., CustomInfo interface MethodInfo extends ..., CustomInfo interface BranchInfo extends ..., CustomInfo interface StatementInfo extends ..., CustomInfo 2
347CLOV-1790Rename StatementInfo to ExpressionInfoRename StatementInfo to ExpressionInfo in the API. Java is the odd one out here. Scala, Clojure etc all have expressions as there basic unit of execution. A statement is an expression with no result. 1
348CLOV-1792Drop classic HTML reportremove classic reports in Clover * report type='classic' print error? or warning and ignore... * remove old velocity templates * drop libraries ** Overlibvms not until we drop Classic reports (Clover 4.1) ** Utils.js (rewrite query parsing into clover.js) ** sorttable.js2
349CLOV-1793Drop Grails 1.3 * remove legacy code (if any)2
350CLOV-1794Drop Eclipse 3.6 and 3.7* compile against eclipse 4.2 * fix deprecation warnings etc * remove legacy code (if any) * bump version numbers in feature name1
351CLOV-1795Remove --style from Command line processors{{--style}} argument has been deprecated in 4.1.0 it should be removed in next major version 4.2.0. Scope: * remove HtmlReporter#Style * update docs i necessary * cleanup all TODO CLOV-17951
352CLOV-1797Support for IDEA 14.1.5It should work but let's be sure. http://blog.jetbrains.com/idea/2015/09/intellij-idea-14-1-5-update-is-out/1
353CLOV-1800Walk AST and store file and type info in databaseWalk the AST tree and handle FileInfo and ClassInfo (TypeInfo) elements - register them in Clover database. Print them in reports. We shall handle Scala's class / object / trait types. (including anonymous?) 8
354CLOV-1801Walk AST and store method info in a databaseWalk AST and register methods and functions (including inline / anonymous ones?) in a database. Print them in reports. To be considered: naming convention.8
355CLOV-1802Walk AST and store statement info in a databaseNULL8
356CLOV-1804Add support for Eclipse Mars.1Eclipse Mars.1 was released on 01.10. Make sure Clover is compatible by: * smoke testing * adding new version to Eclipse versions matrix. 1
357CLOV-1808StringIndexOutOfBoundsException in CloverStartup.evaluateDaysLeftClover fails to decode the license key. Stacktrace: {noformat} Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 47 at java.lang.String.charAt(String.java:646) at com.atlassian.clover.CloverStartup.evaluateDaysLeft(CloverStartup.java:334) at com.atlassian.clover.CloverStartup.loadLicense(CloverStartup.java:122) at com.atlassian.clover.CloverStartup.loadLicense(CloverStartup.java:26) at com.atlassian.clover.CloverInstr.mainImpl(CloverInstr.java:45) at com.atlassian.maven.plugin.clover.internal.instrumentation.AbstractInstrumenter.instrumentSources(AbstractInstrumenter.java:196) at com.atlassian.maven.plugin.clover.internal.instrumentation.AbstractInstrumenter.instrument(AbstractInstrumenter.java:71) at com.atlassian.maven.plugin.clover.CloverInstrumentInternalMojo.execute(CloverInstrumentInternalMojo.java:290) at com.atlassian.maven.plugin.clover.CloverSetupMojo.execute(CloverSetupMojo.java:30) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager. java:134): .. 11 more {noformat} 1
358CLOV-1817Fix colors of test passed / failed / error icons in EclipseCurrently we use dark blue color for a failed test. It's not contrast enough compared to the green one. Furthermore, we use a red background for a "FAIL" status label, which is not consistent. Also, a green background used for a "PASS" label is different from the green dot in the icon. Current colors used: green-pass, blue-fail, red-error are the same as in Eclipse's JUnit view. Consider also changing a dot to three different figures to make it accessible for color-blinded people. For instance: * light green circle - pass * dark blue triangle - fail * red square - error 1
359CLOV-1823Test optimization in Eclipse Mars 4.5.1 keeps running one testSteps to reproduce: * rebuild a project, clean database and optimization snapshot * two times on 'run optimized' button, for the first time it runs all test, for the second time it runs one test (and should none)1
360CLOV-1824Add IDEA 14.0.4 to a test matrixThere are differences in app behaviour between IDEA 14.0.x and 14.1.x. As we're testing Clover against 12.1.7 and 13.0.0, it'd be good to add also 12.0.4, 13.1.6, 14.0.4 to our test matrix. This way we will cover IDEA 12.0, 12.1, 13.0, 13.1, 14.0 and 14.1. 1
361CLOV-1825Add more debug logging for clover2:aggregateCurrently, it's not known why a project has no child databases and what user can do with it. 1
362CLOV-1827Update Clover Tutorial * use source=1.6 instead of 1.4 * download required JARs (build*.xml) * do not require env.GROOVY_HOME set to 1.7 * rename 'test' to 'test.run' * remove cloverjunitlib.xml * convert unit tests to JUnit4 * simplify goals * use clover-maven-plugin 1
363CLOV-1828Rename maven-clover2-plugin to clover-maven-plugin (post-release tasks)*Scope of the change:* _Before release_ See CLOV-1775. _After release_ (/) update documentation: * (/) on confluence.atlassian.com, * (/) docs.atlassian.com, * (/) answers.atlassian.com (rename all references of maven-clover2-plugin), * (?) add comments on stackoverflow -> not doing * (!) update Bamboo Clover Plugin (automatic integration shall use new maven plugin) -> BAM-16590 tracked in CLOV-1859 * (/) check Hudson / Jenkins Clover Plugin if they have any references -> _no references_ * (/) update Clover Examples repository optional (not doing): * move repository to bitbucket.org/atlassian/clover-maven-plugin ** note that bitbucket does not support redirects from old to new url - https://bitbucket.org/site/master/issues/6325/need-a-forwarder-option-for-renamed-repos ** thus we'd have to a) clone the repo to new location, b) set old repo as read-only and add a notice in README, c) update URLs in pom.xml 2
364CLOV-1834Instrumentation failure of an annotation inside the catch clauseClover is failing to instrument below section of java 7 code {code} try { innerStream.close(); } catch (@SuppressWarnings("unused") final IOException e) { // ignore } {code} This is a perfectly valid java 7 syntax but clover instrumentation fails at @SuppressWarnings("unused") annotation. 1
365CLOV-1835Unicode 0x200B (zero-width whitespace) causes instrumentation failureJDK 6 implements Unicode 4.0. In this version of Unicode, the zero-width whitespace character (0x200B) is being treated as a whitespace. JDK 7 implements Unicode 6.0. In this version of Unicode, the zero-width whitespace has been reclassified to the 'format character' group (other characters in this group are, for example, left-/right- text direction markers). Thus, Java compiler in JDK 6 allows to use 0x200B as a normal whitespace character, e.g. separating symbols. The Java compiler since JDK 7 silently ignores the 0x200B, which means that it cannot be used to separate symbols anymore. However you can put this character virtually in any place, e.g.: {code:java} void this<200B>Is<200B>MyMethod(); {code} Clover fails on parsing the 200B character: {noformat} Xyz.java:287:90:unexpected char: 0x200B at com.atlassian.clover.instr.java.Instrumenter.instrument(Instrumenter.java:166) at com.atlassian.clover.CloverInstr.execute(CloverInstr.java:76) at com.atlassian.clover.CloverInstr.mainImpl(CloverInstr.java:54) at ... {noformat} *Planned fix:* * Ignore 200B characters in Java 7+. Treat 200B character as space in Java 6. * Question: Shall it be based on source level setting or the JDK detected? * Question: which other control characters needs to be ignored by Clover? * Question: which other whitespace characters (other than space, \t, \n, \r) shall be recognized by Clover parser? *Workaround:* Remove all 200B character occurrences from the source code. 2
366CLOV-1841Prepare feature analysis of JCov toolAnalyse https://wiki.openjdk.java.net/display/CodeTools/jcov and publish on https://confluence.atlassian.com/display/CLOVER/Comparison+of+code+coverage+tools 2
367CLOV-1846IntelliJ Plugin should ask for rebuilding project after changing exclusionsCurrently it doesn't always ask which sometime may lead to {{ClassNotFoudException}} h2. Preconditions IntelliJ IDEA with Clover installed h2. Repro steps # Clean project and coverage db # Exclude some class with context menu # Run tests # Wait for exception h2. Expected result # Clean project and coverage db # Exclude some class with context menu # Clover asks user for rebuilding the project. 1
368CLOV-1847IntelliJ Plugin should not use UI thread to generate Cloud reportCurrently Clover generates Cloud report in UI thread, it can take couple of seconds with bigger projects causing whole UI to freeze. Let's try to move it back to background somehow. 2
369CLOV-1848Add IntelliJ 15.0.2 to test matrixAdd IntelliJ 15.0.2 to test matrix after it being released. Currently there was RC released. 1
370CLOV-1852Gradle SpecSimple spec showing what do we want to achieve and what's the MVP for 4.2.0 1
371CLOV-1855Drop support for IntelliJ IDEA 11.xScope: * drop support for IntelliJ IDEA 11.x * refactor deprecated code * remove IntelliJ 11.x from test matrix * update plugin.xml to tell correct minimal version of IntelliJ IDEA which is supported. 1
372CLOV-1856IntelliJ IDEA plugin with version 4.1.1 shows wrong supported versionSite for Clover on IntelliJ plugin page indicates Clover 4.1.1 supports Idea 9x however it's not true. Update plugin.xml to show correct version. https://plugins.jetbrains.com/plugin/?id=132 1
373CLOV-1859Update Bamboo Clover Plugin (automatic integration shall use new clover-maven-plugin)Place holder for BAM-165901
374CLOV-1861Create simple Gradle repository and run Bamboo plan to test itScope: * Create simple Gradle plugin as a holder for Clover for Gradle * Create Bamboo plan, which will: ** fetch source code ** run tests1
375CLOV-1884CloverCompilerAdapter should look for Javac.compileList also in super classesIt may happen that user will wrap or subclass the Apache's Javac field. In such case, Clover won't be able to find and set this field and break the build. The CloverCompilerAdapter should look it up in a class hierarchy. We can use Apache's FieldUtils for this purpose.1
376CLOV-1887Provide high level instrumentation task which will instrument sources to given directoryConsider only single module java projects for now4
377CLOV-1888Provide high level task which will execute tests in simple module java projectNULL4
378CLOV-1890Provide simple reporting task which generate Clover reportLet's stick to html report only for now. Don't bother about multi project build for now 2
379CLOV-1892Make Clover instrumentation work in multi java project buildsNULL3
380CLOV-1896Clover shall be able to instrument Test sourcesNULL2
381CLOV-1907TestWithClover task must be aware of instrumented test sources and modify test classpath accordinglyNULL2
382CLOV-1951Support Eclipse 4.6 NeonMake Clover-for-Eclipse compatible with Eclipse Neon. Problems found so far: 1. Running optimised tests throws an exception {code:java} eclipse.buildId=4.6.0.I20160525-2000 java.version=1.8.0_51 java.vendor=Oracle Corporation BootLoader constants: OS=macosx, ARCH=x86_64, WS=cocoa, NL=en_US Framework arguments: -product org.eclipse.epp.package.java.product -product org.eclipse.epp.package.java.product -product org.eclipse.epp.package.java.product Command-line arguments: -os macosx -ws cocoa -arch x86_64 -product org.eclipse.epp.package.java.product -product org.eclipse.epp.package.java.product -data file:/Users/mparfianowicz/.eclipse-4.6-workspace/ -product org.eclipse.epp.package.java.product org.eclipse.ui Error Tue Jun 14 15:51:17 CEST 2016 Unhandled event loop exception org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NullPointerException) at org.eclipse.swt.SWT.error(SWT.java:4533) at org.eclipse.swt.SWT.error(SWT.java:4448) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4024) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3700) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:687) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:604) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) at org.eclipse.equinox.launcher.Main.run(Main.java:1519) Caused by: java.lang.NullPointerException at com.atlassian.clover.eclipse.testopt.views.actions.SavingsNotificationContributionItem$1$1.run(SavingsNotificationContributionItem.java:33) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182) ... 23 more {code}   2. Deprecated API (/) SubProgressMonitor in org.eclipse.core.runtime has been deprecated ViewerSorter in org.eclipse.jface.viewers has been deprecated setSorter(ViewerSorter) in StructuredViewer has been deprecated Main(PrintWriter,PrintWriter,boolean) in Main has been deprecated 3. Code incompatibility (/) CoverageAnnotationModel is not abstract and does not override abstract method getAnnotationIterator() in IAnnotationModel3
383CLOV-1953Clover does not instrument all nodes in Groovy ASTProblem was reproduced in Groovy 2.4.3 and 2.4.4: https://answers.atlassian.com/questions/39141626/why-is-clover-showing-green-on-gray https://answers.atlassian.com/questions/39141622/incomplete-clover-coverage-in-grails-2.5-integration-testing5
384CLOV-1955Support InteliiJ IDEA 2016.2 * add 2016.2.0 to test matrix and verify all tests are green * switch clover-idea to compile against 2016.2 API, check deprecation warnings, compilation problems1
385CLOV-1960Instrument Groovy traits and show code coverage for them*Current status* Groovy 2.3 introduced traits - a code construct for composition of behaviours: * http://docs.groovy-lang.org/latest/html/documentation/core-traits.html Currently Clover handles them like an interface - it records the class name in a database but it does not instrument the class, so it shows no code coverage in reports for them. Side note: Clover's reports by default do not show classes containing no executable code (empty classes, plain enums, interfaces with no default methods, traits) - you can show them by setting [showEmpty=true|https://confluence.atlassian.com/display/CLOVER/clover-report] parameter. *Proposed improvement* Instrument Groovy traits like normal classes or enums. Side note: Groovy 2.5 will probably not introduce interfaces with default methods (like in Java 8). * http://docs.groovy-lang.org/next/html/documentation/#_interface *Technical obstacles* * method '$CLV_R$' is private but should be public in a trait * method 'com_atlassian_clover.CoverageRecorder $CLV_R$()' must not be static; only fields may be static in a trait * field '$CLV_R$' is not 'public static final' in a trait 8