I spent a few minutes this morning trying to get an emma coverage report over contrib. Short answer is that it doesn't work -- emma throws an exception while instrumenting the code (see attached console.txt).
I will go and bug the emma folks, but first wanted to ask here if there is any specific reason that Clojure-generated bytecode might surprise emma? I have attached a modified build.xml if anybody wants to try this out. Stu --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---
<project name="clojure-contrib" default="jar" xmlns:mvn="urn:maven-artifact-ant"> <description> Pack all clojure-contrib sources into a JAR. Compile those that can be compiled standalone if the clojure.jar property points us to clojure.jar. </description> <property name="src" location="src"/> <property name="build" location="classes"/> <available property="hasclojure" file="${clojure.jar}"/> <!-- The JAR file to create. --> <property name="jarfile" location="clojure-contrib.jar"/> <property name="slimjarfile" location="clojure-contrib-slim.jar"/> <!-- These make sense for building on tapestry.formos.com --> <property name="snapshot.repo.dir" location="/var/www/maven-snapshot-repository"/> <property name="stable.repo.dir" location="/var/www/maven-repository"/> <target name="init"> <tstamp/> <mkdir dir="${build}"/> </target> <target name="clean" description="Remove generated files and directories."> <delete file="${jarfile}"/> <delete file="${slimjarfile}"/> <delete dir="${build}"/> </target> <target name="test_clojure" description = "Run clojure tests" if="hasclojure"> <java classname="clojure.main"> <classpath> <path location="${build}"/> <path location="${src}"/> <path location="${clojure.jar}"/> </classpath> <arg value="-e"/> <arg value="(require '(clojure.contrib [test-clojure :as main])) (main/run)"/> </java> </target> <target name="test_contrib" description = "Run contrib tests" if="hasclojure"> <mkdir dir="coverage"/> <emmajava classname="clojure.main" libclasspathref="emma.lib"> <classpath> <path location="${build}"/> <path location="${src}"/> <path location="${clojure.jar}"/> </classpath> <arg value="-e"/> <arg value="(require '(clojure.contrib [test-contrib :as main])) (main/run)"/> <txt outfile="coverage/coverage.txt" /> <xml outfile="coverage/coverage.xml" /> <html outfile="coverage/coverage.html" /> <filter includes="clojure.contrib.*"/> </emmajava> </target> <!-- you will need to grab these files from http://emma.sourceforge.net/ --> <path id="emma.lib" > <pathelement location="emma/emma.jar" /> <pathelement location="emma/emma_ant.jar" /> </path> <taskdef resource="emma_ant.properties" classpathref="emma.lib" /> <target name="emma" description="turns on EMMA's on-the-fly instrumentation mode" > <property name="emma.enabled" value="true" /> </target> <target name="test_datalog" description = "Run datalog tests" if="hasclojure"> <java classname="clojure.main"> <classpath> <path location="${build}"/> <path location="${src}"/> <path location="${clojure.jar}"/> </classpath> <arg value="-e"/> <arg value="(require '(clojure.contrib.datalog.tests [test :as main])) (main/run)"/> </java> </target> <target name="test" depends="test_clojure,test_contrib,test_datalog" description="Run all tests"/> <target name="check_hasclojure" description="Print a warning message if clojure.jar is undefined" unless="hasclojure"> <echo>WARNING: You have not defined a path to clojure.jar so I can't compile files. This will cause some parts of clojure.contrib not to work (e.g., pretty print). To enable compiling, run "ant -Dclojure.jar=<...path to clojure.jar..>" </echo> </target> <target name="compile_clojure" depends="init,check_hasclojure" description="Compile Clojure sources." if="hasclojure"> <java classname="clojure.lang.Compile"> <classpath> <path location="${build}"/> <path location="${src}"/> <path location="${clojure.jar}"/> </classpath> <sysproperty key="clojure.compile.path" value="${build}"/> <arg value="clojure.contrib.accumulators"/> <arg value="clojure.contrib.command-line"/> <arg value="clojure.contrib.complex-numbers"/> <arg value="clojure.contrib.cond"/> <arg value="clojure.contrib.core"/> <arg value="clojure.contrib.def"/> <arg value="clojure.contrib.duck-streams"/> <arg value="clojure.contrib.except"/> <arg value="clojure.contrib.fcase"/> <arg value="clojure.contrib.generic"/> <arg value="clojure.contrib.generic.arithmetic"/> <arg value="clojure.contrib.generic.collection"/> <arg value="clojure.contrib.generic.comparison"/> <arg value="clojure.contrib.generic.functor"/> <arg value="clojure.contrib.generic.math-functions"/> <arg value="clojure.contrib.import-static"/> <arg value="clojure.contrib.javadoc.browse"/> <arg value="clojure.contrib.javadoc.browse-ui"/> <arg value="clojure.contrib.lazy-seqs"/> <arg value="clojure.contrib.mmap"/> <arg value="clojure.contrib.macros"/> <arg value="clojure.contrib.monads"/> <arg value="clojure.contrib.ns-utils"/> <arg value="clojure.contrib.pprint.ColumnWriter"/> <arg value="clojure.contrib.pprint.PrettyWriter"/> <arg value="clojure.contrib.pprint"/> <arg value="clojure.contrib.pprint.utilities"/> <arg value="clojure.contrib.probabilities.dist"/> <arg value="clojure.contrib.prxml"/> <arg value="clojure.contrib.repl-ln"/> <arg value="clojure.contrib.repl-utils"/> <arg value="clojure.contrib.seq-utils"/> <arg value="clojure.contrib.set"/> <arg value="clojure.contrib.server-socket"/> <arg value="clojure.contrib.sql.internal"/> <arg value="clojure.contrib.sql"/> <arg value="clojure.contrib.str-utils"/> <arg value="clojure.contrib.stream-utils"/> <arg value="clojure.contrib.test-clojure"/> <arg value="clojure.contrib.test-is"/> <arg value="clojure.contrib.trace"/> <arg value="clojure.contrib.types"/> <arg value="clojure.contrib.zip-filter"/> <arg value="clojure.contrib.graph"/> <arg value="clojure.contrib.datalog"/> <arg value="clojure.contrib.datalog.database"/> <arg value="clojure.contrib.datalog.literals"/> <arg value="clojure.contrib.datalog.magic"/> <arg value="clojure.contrib.datalog.rules"/> <arg value="clojure.contrib.datalog.softstrat"/> <arg value="clojure.contrib.datalog.util"/> <arg value="clojure.contrib.dataflow"/> </java> </target> <target name="jar" description="Create jar files." depends="compile_clojure"> <jar jarfile="${jarfile}"> <fileset file="epl-v10.html"/> <fileset dir="${src}" includes="**/*.clj"/> <fileset dir="${build}" includes="**/*.class"/> <manifest> <attribute name="Class-Path" value="."/> </manifest> </jar> <jar jarfile="${slimjarfile}"> <fileset file="epl-v10.html"/> <fileset dir="${src}" includes="**/*.clj"/> <manifest> <attribute name="Class-Path" value="."/> </manifest> </jar> </target> <target name="clean-build" depends="clean,compile_clojure,test,jar" description="Clean build with tests."/> <macrodef name="build-and-deploy"> <attribute name="target-dir" description="Root of Maven repository"/> <sequential> <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant"/> <mvn:pom file="pom.xml" id="contrib.pom"/> <mvn:dependencies pomRefId="contrib.pom"/> <antcall target="clean-build"> <param name="clojure.jar" value="${org.clojure:clojure-lang:jar}"/> </antcall> <mvn:deploy file="${jarfile}" pomrefid="contrib.pom"> <attach file="${slimjarfile}" classifier="slim"/> <remoteRepository url="file:@{target-dir}"/> </mvn:deploy> </sequential> </macrodef> <target name="nightly-build" description="Build and deploy to nightly (snapshot) repository."> <build-and-deploy target-dir="${snapshot.repo.dir}"/> </target> <target name="stable-build" description="Build and deploy to stable repository."> <build-and-deploy target-dir="${stable.repo.dir}"/> </target> <property name="emma.dir" value="${basedir}/emma" /> </project>
: ant -Dclojure.jar=../clojure/clojure.jar test_contrib Buildfile: build.xml test_contrib: [emmajava] EMMA: package [clojure/contrib] contains classes [test_is__init] without full debug info [emmajava] java.lang.ExceptionInInitializerError (test_contrib.clj:0) [emmajava] at clojure.lang.Compiler.eval(Compiler.java:4533) [emmajava] at clojure.lang.Compiler.load(Compiler.java:4846) [emmajava] at clojure.lang.RT.loadResourceScript(RT.java:325) [emmajava] at clojure.lang.RT.loadResourceScript(RT.java:316) [emmajava] at clojure.lang.RT.load(RT.java:394) [emmajava] at clojure.lang.RT.load(RT.java:366) [emmajava] at clojure.core$load__5042$fn__5045.invoke(core.clj:3746) [emmajava] at clojure.core$load__5042.doInvoke(core.clj:3745) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:413) [emmajava] at clojure.core$load_one__4994.invoke(core.clj:3590) [emmajava] at clojure.core$load_lib__5015.doInvoke(core.clj:3627) [emmajava] at clojure.lang.RestFn.applyTo(RestFn.java:147) [emmajava] at clojure.core$apply__3231.doInvoke(core.clj:408) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:443) [emmajava] at clojure.core$load_libs__5027.doInvoke(core.clj:3657) [emmajava] at clojure.lang.RestFn.applyTo(RestFn.java:142) [emmajava] at clojure.core$apply__3231.doInvoke(core.clj:408) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:443) [emmajava] at clojure.core$require__5033.doInvoke(core.clj:3713) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:413) [emmajava] at user$eval__1.invoke(Unknown Source) [emmajava] at clojure.lang.Compiler.eval(Compiler.java:4522) [emmajava] at clojure.core$eval__3975.invoke(core.clj:1743) [emmajava] at clojure.main$eval_opt__5805.invoke(main.clj:220) [emmajava] at clojure.main$initialize__5812.invoke(main.clj:239) [emmajava] at clojure.main$null_opt__5834.invoke(main.clj:264) [emmajava] at clojure.main$main__5854$fn__5856.invoke(main.clj:333) [emmajava] at clojure.main$main__5854.doInvoke(main.clj:328) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:426) [emmajava] at clojure.lang.Var.invoke(Var.java:350) [emmajava] at clojure.lang.AFn.applyToHelper(AFn.java:175) [emmajava] at clojure.lang.Var.applyTo(Var.java:463) [emmajava] at clojure.main.main(main.java:39) [emmajava] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [emmajava] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [emmajava] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [emmajava] at java.lang.reflect.Method.invoke(Method.java:597) [emmajava] at com.vladium.emma.rt.AppRunner$Invoker.run(AppRunner.java:655) [emmajava] at java.lang.Thread.run(Thread.java:637) [emmajava] Caused by: java.lang.ExceptionInInitializerError [emmajava] at java.lang.Class.forName0(Native Method) [emmajava] at java.lang.Class.forName(Class.java:247) [emmajava] at clojure.lang.RT.loadClassForName(RT.java:1491) [emmajava] at clojure.lang.RT.load(RT.java:384) [emmajava] at clojure.lang.RT.load(RT.java:366) [emmajava] at clojure.core$load__5042$fn__5045.invoke(core.clj:3746) [emmajava] at clojure.core$load__5042.doInvoke(core.clj:3745) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:413) [emmajava] at clojure.core$load_one__4994.invoke(core.clj:3590) [emmajava] at clojure.core$load_lib__5015.doInvoke(core.clj:3627) [emmajava] at clojure.lang.RestFn.applyTo(RestFn.java:147) [emmajava] at clojure.core$apply__3231.doInvoke(core.clj:408) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:443) [emmajava] at clojure.core$load_libs__5027.doInvoke(core.clj:3653) [emmajava] at clojure.lang.RestFn.applyTo(RestFn.java:142) [emmajava] at clojure.core$apply__3231.doInvoke(core.clj:408) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:443) [emmajava] at clojure.core$require__5033.doInvoke(core.clj:3713) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:426) [emmajava] at clojure.contrib.test_is__init.load(Unknown Source) [emmajava] at clojure.contrib.test_is__init.<clinit>(Unknown Source) [emmajava] at java.lang.Class.forName0(Native Method) [emmajava] at java.lang.Class.forName(Class.java:247) [emmajava] at clojure.lang.RT.loadClassForName(RT.java:1491) [emmajava] at clojure.lang.RT.load(RT.java:384) [emmajava] at clojure.lang.RT.load(RT.java:366) [emmajava] at clojure.core$load__5042$fn__5045.invoke(core.clj:3746) [emmajava] at clojure.core$load__5042.doInvoke(core.clj:3745) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:413) [emmajava] at clojure.core$load_one__4994.invoke(core.clj:3590) [emmajava] at clojure.core$load_lib__5015.doInvoke(core.clj:3627) [emmajava] at clojure.lang.RestFn.applyTo(RestFn.java:147) [emmajava] at clojure.core$apply__3231.doInvoke(core.clj:408) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:443) [emmajava] at clojure.core$load_libs__5027.doInvoke(core.clj:3653) [emmajava] at clojure.lang.RestFn.applyTo(RestFn.java:142) [emmajava] at clojure.core$apply__3231.doInvoke(core.clj:408) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:460) [emmajava] at clojure.core$use__5036.doInvoke(core.clj:3723) [emmajava] at clojure.lang.RestFn.invoke(RestFn.java:413) [emmajava] at user$eval__4.invoke(test_contrib.clj:15) [emmajava] at clojure.lang.Compiler.eval(Compiler.java:4522) [emmajava] ... 38 more [emmajava] Caused by: java.lang.ArrayIndexOutOfBoundsException: 14 [emmajava] at com.vladium.emma.instr.InstrVisitor$Block.emit(InstrVisitor.java:1445) [emmajava] at com.vladium.emma.instr.InstrVisitor.visit(InstrVisitor.java:1144) [emmajava] at com.vladium.jcd.cls.attribute.CodeAttribute_info.accept(CodeAttribute_info.java:137) [emmajava] at com.vladium.emma.instr.InstrVisitor.visit(InstrVisitor.java:446) [emmajava] at com.vladium.emma.instr.InstrVisitor.visit(InstrVisitor.java:255) [emmajava] at com.vladium.emma.instr.InstrVisitor.process(InstrVisitor.java:111) [emmajava] at com.vladium.emma.rt.InstrClassLoadHook.processClassDef(InstrClassLoadHook.java:87) [emmajava] at com.vladium.emma.rt.InstrClassLoader.findClass(InstrClassLoader.java:275) [emmajava] at com.vladium.emma.rt.InstrClassLoader.loadClass(InstrClassLoader.java:122) [emmajava] at java.lang.ClassLoader.loadClass(ClassLoader.java:251) [emmajava] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374) [emmajava] at clojure.contrib.template__init.load(Unknown Source) [emmajava] at clojure.contrib.template__init.<clinit>(Unknown Source) [emmajava] ... 80 more [emmajava] EMMA: not all instrumented classes were compiled with source file [emmajava] EMMA: debug data: no sources will be embedded in the report. [emmajava] EMMA: line coverage requested in a report of type [txt] but [emmajava] EMMA: not all instrumented classes were compiled with line number [emmajava] EMMA: debug data: this column will be removed from the report. [emmajava] EMMA: showing up to 3 classes without full debug info per package: [emmajava] EMMA: clojure.contrib.template__init [emmajava] EMMA: clojure.contrib.test_is__init [emmajava] EMMA: clojure.contrib.walk__init [emmajava] EMMA: writing [txt] report to [/Users/stuart/relevance/customers/rids-alert/vendor/clojure-contrib/coverage/coverage.txt] ... [emmajava] EMMA: not all instrumented classes were compiled with source file [emmajava] EMMA: debug data: no sources will be embedded in the report. [emmajava] EMMA: line coverage requested in a report of type [xml] but [emmajava] EMMA: not all instrumented classes were compiled with line number [emmajava] EMMA: debug data: this column will be removed from the report. [emmajava] EMMA: showing up to 3 classes without full debug info per package: [emmajava] EMMA: clojure.contrib.template__init [emmajava] EMMA: clojure.contrib.test_is__init [emmajava] EMMA: clojure.contrib.walk__init [emmajava] EMMA: writing [xml] report to [/Users/stuart/relevance/customers/rids-alert/vendor/clojure-contrib/coverage/coverage.xml] ... [emmajava] EMMA: not all instrumented classes were compiled with source file [emmajava] EMMA: debug data: no sources will be embedded in the report. [emmajava] EMMA: line coverage requested in a report of type [html] but [emmajava] EMMA: not all instrumented classes were compiled with line number [emmajava] EMMA: debug data: this column will be removed from the report. [emmajava] EMMA: showing up to 3 classes without full debug info per package: [emmajava] EMMA: clojure.contrib.template__init [emmajava] EMMA: clojure.contrib.test_is__init [emmajava] EMMA: clojure.contrib.walk__init [emmajava] EMMA: writing [html] report to [/Users/stuart/relevance/customers/rids-alert/vendor/clojure-contrib/coverage/coverage.html] ... BUILD SUCCESSFUL Total time: 2 seconds