Would be great if anyone could give me any pointers as to;
- whether it would be possible to make the inbuild java plugin test task to 
execute with a weaving classloader (aspectj)
- if I have to stick with my own custom test task, how would I get an overview 
of what the java plugin test task does so that I could "reuse" and replicate as 
much as possible from it ?

I would have loved to get rid of our aspectified/aspect dependent tests, but 
unfortunately we have thousands of them (:


cheers
Magnus






From: [email protected]
To: [email protected]
Date: Tue, 3 Aug 2010 07:45:21 +0000
Subject: RE: [gradle-user] running tests with a weavingclassloader








Hi, 

A little update on this one. Haven't managed to get the java plugin test task 
to work, but have managed to get 2 different ant inspired flavours to work.
...however none of them are ideal in my eyes. Would have preferred if I could 
override/configure the java plugin test task..

1) custom task that invokes junit through ant -> have to run with -i on 
commandline to get the output (:
2) custom java exec task which calls ant main invoking a xml build file (have 
to maintain a separate file)


Alternative 1:
----------------
task testJunit << {
  testReportsDir = new File(buildDir, "reports/tests")
  testReportsDir.mkdirs()
  ant {
    taskdef(name: "runTests", 
classname:"org.apache.tools.ant.taskdefs.optional.junit.JUnitTask") {
      classpath {
        pathelement(path:configurations.antJunitTest.asPath)
      }
    }
    runTests(printsummary:"true", haltonfailure:"no", fork:"yes", 
forkmode:"perBatch") {
      
jvmarg(value:"-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl")
      
jvmarg(value:"-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl")
      
jvmarg(value:"-Djava.system.class.loader=com.telenor.cosmos.system.test.CosmosWeavingURLClassLoader")
      
jvmarg(value:"-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl")
      classpath {
        pathelement(path:configurations.testCompile.asPath)
        pathelement(path:new File(buildDir, "classes/test"))
        pathelement(path:new File(buildDir, "classes/test/aspects"))
        pathelement(path:new File(buildDir, "classes/main"))
      }
      formatter(type:"plain")
      batchtest(todir:testReportsDir, failureproperty:"junit.failure") {
        fileset(dir:sourceSets.test.classesDir, includes:"**/*TestCase.class" )
      }
    }
  }
}


Alternative 2:
task testJunitJava(type: JavaExec)  {
  classpath = configurations.antJunitTest
  main = "org.apache.tools.ant.Main"
  args = ["-buildfile", new File(projectDir, "build-tests-ltw.xml")]
  systemProperties("test.classpath":configurations.testCompile.asPath, 
"target.test.aspects":new File(buildDir, "classes/test-aspects"))
}

and the build-tests-ltw.xml (which obviously could be simplified a lot with 
sending in properties from the gradle javaexec call):
<project name="external-unittest" default="test" basedir=".">
    <target name="test">
        <!-- Defaults. Can be overridden on the command line -->
        <property name="maven.test.include" value="**/*TestCase.class"/>
        <property name="maven.test.exclude" value=""/>
        <property name="weaving.class.loader" 
value="com.telenor.cosmos.system.test.CosmosWeavingURLClassLoader"/>
        
        <junit printsummary="true" haltonfailure="no" fork="yes" 
forkmode="perBatch">
            <jvmarg 
value="-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"/>
            <jvmarg 
value="-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"/>
            <jvmarg value="-Djava.system.class.loader=${weaving.class.loader}"/>
            <jvmarg 
value="-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"/>
            <jvmarg value="-Xmx768m"/>
            <jvmarg value="-XX:MaxPermSize=192m"/>
            <classpath>
                <pathelement path="${java.class.path}"/>
                <pathelement path="${test.classpath}"/>
                <pathelement 
path="c:\dev\tools\apache-ant-1.8.1\libs17\ant-junit.jar"/>
                <pathelement path="${target.test.aspects}"/>
                <pathelement path="target/classes/test"/>
                <pathelement path="target/classes/main"/>
            </classpath>

            <formatter type="xml"/>

            <batchtest todir="target/test-results" 
failureproperty="junit.failure">
                <fileset dir="target/classes/test" 
includes="${maven.test.include}" excludes="${maven.test.exclude}"/>
            </batchtest>
        </junit>

        <antcall target="writeJunitIfSet"/>
        <antcall target="writeJunitIfNotSet"/>
    </target>

    <target name="writeJunitIfSet" if="junit.failure">
        <echo file="target/junit.tmp" 
append="false">junit.failure=${junit.failure}
        </echo>
    </target>

    <target name="writeJunitIfNotSet" unless="junit.failure">
        <echo file="target/junit.tmp" append="false">#All tests passed
        </echo>
    </target>

</project>



cheers
Magnus




From: [email protected]
To: [email protected]
Date: Mon, 2 Aug 2010 07:12:56 +0000
Subject: [gradle-user] running tests with a weavingclassloader








HI, 

I'm wondering if its possible(/and how) to get the gradle test task (from java 
plugin) to run tests using a an aspecj WeavingClassLoader.
In our current build we run a forked java task in ant that invokes ant junit 
(which again is forked per batch).


our current ant test;
<target name="test-junit" depends="check-test-junit-uptodate" 
unless="test.junit.uptodate">
        <mkdir dir="${target.test.reports}"/>
        <property name="test.path" refid="test.path.id"/>
        <java classname="org.apache.tools.ant.Main" fork="yes" dir=".">
            <jvmarg value="-Xmx512m"/>
            <jvmarg value="-XX:MaxPermSize=192m"/>
            <arg value="-buildfile"/>
            <arg value="${common.dir}/build-tests-ltw.xml"/>
            <arg line="-Dbasedir='.'"/>
            <arg line="-Dtest.classpath='${test.path}'"/>
            <arg line="-Dmaven.junit.printSummary='true'"/>
            <arg line="-Dmaven.test.include='**/*TestCase.class'"/>
            <arg line="-Dweaving.class.loader='${weaving.class.loader}'"/>
            <classpath>
                <path location="c:\dev\tools\apache-ant-1.8.1\libs17\ant.jar"/>
                <path 
location="c:\dev\tools\apache-ant-1.8.1\libs17\ant-junit.jar"/>
                <path 
location="c:\dev\tools\apache-ant-1.8.1\libs17\ant-launcher.jar"/>
                <path location="${lib.dir}/junit.jar"/>
            </classpath>
        </java>
        <tstamp/>
        <echo file="${junit.timestamp}">${DSTAMP} - ${TSTAMP}</echo>
    </target>

contents of build-tests-ltw.xml
<target name="test">
        <!-- Defaults. Can be overridden on the command line -->
        <property name="maven.test.include" value="**/*TestCase.class"/>
        <property name="maven.test.exclude" value=""/>
        <property name="weaving.class.loader" 
value="com.telenor.cosmos.system.test.CosmosWeavingURLClassLoader"/>

        <junit printsummary="true" haltonfailure="no" fork="yes" 
forkmode="perBatch">
            <jvmarg 
value="-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"/>
            <jvmarg 
value="-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"/>
            <jvmarg value="-Djava.system.class.loader=${weaving.class.loader}"/>
            <jvmarg 
value="-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"/>
            <jvmarg value="-Xmx768m"/>
            <jvmarg value="-XX:MaxPermSize=192m"/>
            <classpath>
                <pathelement path="${java.class.path}"/>
                <pathelement path="${test.classpath}"/>
                <pathelement path="${target.test.aspects}"/>
            </classpath>

            <formatter type="xml"/>

            <batchtest todir="target/test-reports" 
failureproperty="junit.failure">
                <fileset dir="target/test-classes" 
includes="${maven.test.include}" excludes="${maven.test.exclude}"/>
            </batchtest>
        </junit>

        <antcall target="writeJunitIfSet"/>
        <antcall target="writeJunitIfNotSet"/>
    </target>

...never mind the duplication, the important bit is getting gradle to use the 
CosmosWeavingClassLoader (that extends aspectj CosmosWeavingClassLoader).

I tried to simply set 

dependencies {
  compile project(':cosmos-test') // + a range of other dependencies...
  testCompile // various test dependencies
  testRuntime project(':cosmos-test') //this is the project containing the 
CosmosWeavingClassLoader
}

test {
  systemProperties['java.system.class.loader'] = 
'com.telenor.cosmos.system.test.CosmosWeavingURLClassLoaders'
}


However that currently only results in;
"Error occurred during initialization of VM
java.lang.Error: java.lang.ClassNotFoundException: 
com.telenor.cosmos.system.test.CosmosWeavingURLClassLoaders" ...


any tips/hints would be appreciated.


cheers
Magnus



                                          

Reply via email to