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 [email protected]
To unsubscribe from this group, send email to
[email protected]
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