diff options
author | Michael Bien <[email protected]> | 2009-10-18 19:17:30 +0200 |
---|---|---|
committer | Michael Bien <[email protected]> | 2009-10-18 19:17:30 +0200 |
commit | 79e0951cfdb5fb2371df23edeaf7f8957b0ee3f5 (patch) | |
tree | 7399468d4078c959d99346ba6f90934111e8d031 | |
parent | 23597f78174c318febf35337338890c3665a13c7 (diff) |
added first JUnit test: GlueGenTest.java. (dependencies: junit-4.5.jar, antlr-2.7.7.jar in <gluegenroot>/lib)
Test tests the basic GlueGen lifecycle: generate->compile java->compile native->load lib->call methods
integrated test compile,run and debug targets into NetBeans IDE.
-rw-r--r-- | nbproject/ide-file-targets.xml | 61 | ||||
-rwxr-xr-x | nbproject/project.xml | 106 | ||||
-rw-r--r-- | test/junit/com/sun/gluegen/GlueGenTest.java | 206 | ||||
-rw-r--r-- | test/junit/com/sun/gluegen/build.xml | 93 | ||||
-rw-r--r-- | test/junit/com/sun/gluegen/test.c | 17 | ||||
-rw-r--r-- | test/junit/com/sun/gluegen/test.cfg | 7 | ||||
-rw-r--r-- | test/junit/com/sun/gluegen/test.h | 10 |
7 files changed, 497 insertions, 3 deletions
diff --git a/nbproject/ide-file-targets.xml b/nbproject/ide-file-targets.xml new file mode 100644 index 0000000..ede0f96 --- /dev/null +++ b/nbproject/ide-file-targets.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project basedir=".." name="GlueGen-IDE"> + + <property name="ant.script" value="make/build.xml"/> + + <!-- edit the following targets according to your needs --> + <!-- (more info: http://www.netbeans.org/kb/articles/freeform-config.html--> + + <target name="compile-selected-files-in-junit"> + <fail unless="files">Must set property 'files'</fail> + + <mkdir dir="build/test/build/classes"/> + + <javac destdir="build/test/build/classes" includes="${files}" source="1.5" srcdir="test/junit" debug="true" debuglevel="lines,vars,source"> + <classpath path="build/test/build/classes:build/classes:build/test/gensrc/java:lib/antlr-2.7.7.jar:lib/junit-4.5.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}"/> + </javac> + </target> + + <target name="run-selected-file-in-junit"> + <fail unless="run.class">Must set property 'run.class'</fail> + + <java classname="${run.class}" failonerror="true" fork="true"> + <classpath> + <path path="build/test/build/classes:build/classes:lib/antlr-2.7.7.jar:lib/junit-4.5.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}"/> + </classpath> + </java> + </target> + + <target name="test-selected-file-in-junit"> + <fail unless="run.class">Must set property 'run.class'</fail> + + <junit forkmode="once" showoutput="true" fork="true" failureproperty="tests.failed" errorproperty="tests.failed"> + <test name="${run.class}"> + </test> + <classpath> + <path path="build/test/build/classes:build/test/gensrc/java:build/classes:lib/antlr-2.7.7.jar:lib/junit-4.5.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}"/> + </classpath> + <formatter usefile="false" type="brief"/> + <formatter type="xml"/> + </junit> + </target> + + <target name="debug-selected-file-in-junit"> + <fail unless="debug.class">Must set property 'debug.class'</fail> + + <path id="cp"> + <path path="build/test/build/classes:build/classes:lib/antlr-2.7.7.jar:lib/junit-4.5.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}"/> + </path> + + <nbjpdastart addressproperty="jpda.address" name="GlueGen" transport="dt_socket"> + <classpath refid="cp"/> + </nbjpdastart> + + <java classname="${debug.class}" fork="true"> + <classpath refid="cp"/> + <jvmarg value="-Xdebug"/> + <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/> + </java> + </target> + +</project> diff --git a/nbproject/project.xml b/nbproject/project.xml index 29c70f9..a4c00fa 100755 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -29,6 +29,18 @@ <location>build/gensrc/java</location> <encoding>UTF-8</encoding> </source-folder> + <source-folder> + <label>test/junit</label> + <type>java</type> + <location>test/junit</location> + <encoding>UTF-8</encoding> + </source-folder> + <source-folder> + <label>build/test</label> + <type>java</type> + <location>build/test</location> + <encoding>UTF-8</encoding> + </source-folder> </folders> <ide-actions> <action name="build"> @@ -44,10 +56,74 @@ <target>clean</target> <target>all</target> </action> + <action name="run.single"> + <script>nbproject/ide-file-targets.xml</script> + <target>run-selected-file-in-junit</target> + <context> + <property>run.class</property> + <folder>test/junit</folder> + <pattern>\.java$</pattern> + <format>java-name</format> + <arity> + <one-file-only/> + </arity> + </context> + </action> + <action name="test.single"> + <script>nbproject/ide-file-targets.xml</script> + <target>test-selected-file-in-junit</target> + <context> + <property>run.class</property> + <folder>test/junit</folder> + <pattern>\.java$</pattern> + <format>java-name</format> + <arity> + <one-file-only/> + </arity> + </context> + </action> + <action name="compile.single"> + <script>nbproject/ide-file-targets.xml</script> + <target>compile-selected-files-in-junit</target> + <context> + <property>files</property> + <folder>test/junit</folder> + <pattern>\.java$</pattern> + <format>relative-path</format> + <arity> + <separated-files>,</separated-files> + </arity> + </context> + </action> + <action name="debug.single"> + <script>nbproject/ide-file-targets.xml</script> + <target>debug-selected-file-in-junit</target> + <context> + <property>debug.class</property> + <folder>test/junit</folder> + <pattern>\.java$</pattern> + <format>java-name</format> + <arity> + <one-file-only/> + </arity> + </context> + </action> </ide-actions> <export> <type>folder</type> - <location>bin</location> + <location>build/classes</location> + <script>${ant.script}</script> + <build-target>all</build-target> + </export> + <export> + <type>folder</type> + <location>build/classes</location> + <script>${ant.script}</script> + <build-target>all</build-target> + </export> + <export> + <type>folder</type> + <location>build/classes</location> <script>${ant.script}</script> <build-target>all</build-target> </export> @@ -61,6 +137,14 @@ <label>build/gensrc/java</label> <location>build/gensrc/java</location> </source-folder> + <source-folder style="packages"> + <label>test/junit</label> + <location>test/junit</location> + </source-folder> + <source-folder style="packages"> + <label>build/test</label> + <location>build/test</location> + </source-folder> <source-file> <location>${ant.script}</location> </source-file> @@ -73,12 +157,28 @@ </view> <subprojects/> </general-data> - <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/1"> + <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/2"> <compilation-unit> <package-root>src/java</package-root> + <classpath mode="compile">build/classes:lib/antlr-2.7.7.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}</classpath> + <built-to>build/classes</built-to> + <source-level>1.5</source-level> + </compilation-unit> + <compilation-unit> <package-root>build/gensrc/java</package-root> <classpath mode="compile">build/classes:lib/antlr-2.7.7.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}</classpath> - <built-to>bin</built-to> + <built-to>build/classes</built-to> + <source-level>1.5</source-level> + </compilation-unit> + <compilation-unit> + <package-root>test/junit</package-root> + <unit-tests/> + <classpath mode="compile">build/classes:build/test/gensrc/java:lib/antlr-2.7.7.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}:lib/junit-4.5.jar</classpath> + <built-to>build/classes</built-to> + <source-level>1.5</source-level> + </compilation-unit> + <compilation-unit> + <package-root>build/test</package-root> <source-level>1.5</source-level> </compilation-unit> </java-data> diff --git a/test/junit/com/sun/gluegen/GlueGenTest.java b/test/junit/com/sun/gluegen/GlueGenTest.java new file mode 100644 index 0000000..c21f1ba --- /dev/null +++ b/test/junit/com/sun/gluegen/GlueGenTest.java @@ -0,0 +1,206 @@ +package com.sun.gluegen; + +import com.sun.gluegen.runtime.BufferFactory; +import com.sun.gluegen.runtime.PointerBuffer; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectHelper; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import static java.lang.System.*; + +/** + * @author Michael Bien + */ +public class GlueGenTest { + + private static final Project project = new Project(); + + private static String gluegenRoot; + private static String path; + private static String output; + + + @BeforeClass + public static void setUpTest() throws Exception { + + out.println("System info: "); + out.println("OS: " + System.getProperty("os.name")); + out.println("VM: " + System.getProperty("java.vm.name")); + + // setup paths + try { + File executionRoot = new File(GlueGenTest.class.getProtectionDomain().getCodeSource().getLocation().toURI()); + System.out.println("execution root: " + executionRoot); + gluegenRoot = executionRoot.getParentFile().getParentFile().getParentFile().getParentFile().toString(); + System.out.println("gluegen project root: " + gluegenRoot); + } catch (URISyntaxException ex) { + Logger.getLogger(GlueGenTest.class.getName()).log(Level.SEVERE, "can not determine gluegen root", ex); + Assert.fail(); + } + + path = gluegenRoot + "/test/junit/com/sun/gluegen"; + output = gluegenRoot + "/build/test"; + + //setup ant build file + project.setBaseDir(new File(gluegenRoot)); + + DefaultLogger logger = new DefaultLogger(); + logger.setErrorPrintStream(err); + logger.setOutputPrintStream(out); + logger.setMessageOutputLevel(Project.MSG_INFO); + project.addBuildListener(logger); + + project.init(); + + File buildFile = new File(path, "build.xml"); + ProjectHelper.configureProject(project, buildFile); + } + + @Test + public void generateBindingTest() { + + out.println("path: "+path); + out.println("output: "+output); + + String name = "test"; + + GlueGen.main( + new String[] { + "-I"+path, + "-O"+output+"/gensrc", +// "-Ecom.sun.gluegen.DebugEmitter", + "-C"+path+"/"+name+".cfg", + path+"/"+name+".h" + } + ); + } + + /* yeah, java 6 has even a compiler api... + @Test + public void compileJavaTest() throws IOException { + + out.println("compiling generated files..."); + + String source = output+"/gensrc/java/test/BindingTest.java"; + + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + DiagnosticCollector<JavaFileObject> collector = new DiagnosticCollector<JavaFileObject>(); + StandardJavaFileManager fileManager = compiler.getStandardFileManager(collector, null, null); + + Iterable<? extends JavaFileObject> fileObj = fileManager.getJavaFileObjects(source); + + compiler.getTask( new OutputStreamWriter(out), + fileManager, + collector, + Arrays.asList("-d",output+"/build/java","-verbose"), + null, + fileObj ).call(); + + List<Diagnostic<? extends JavaFileObject>> list = collector.getDiagnostics(); + if(!list.isEmpty()) { + for (Diagnostic<? extends JavaFileObject> d : list) { + out.println("Error on line "+ d.getLineNumber()); + out.println("Compiler Message:\n"+d.getMessage(Locale.ENGLISH)); + } + Assert.fail("compilation test failed"); + } + + fileManager.close(); + + out.println("done"); + + } +*/ + + /* + * fails when ant script fails (which is a good thing). + * executeTarget throws RuntimeException on failure + */ + @Test + public void compileJavaTest() { + project.executeTarget("compile.java"); + } + + /* + * fails when ant script fails (which is a good thing) + * executeTarget throws RuntimeException on failure + */ + @Test + public void compileNativesTest() { + project.executeTarget("compile.native"); + } + + @Test + public void bindingTest() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, InstantiationException { + + String nativesPath = output + "/build/natives"; + System.load(nativesPath + "/libgluegen-rt.so"); + System.load(nativesPath + "/librofl.so"); + + Object bindingTest = Class.forName("test.BindingTest").newInstance(); + + // test values + ByteBuffer dbb = BufferFactory.newDirectByteBuffer(32); + ByteBuffer bb = ByteBuffer.allocate(32).order(ByteOrder.nativeOrder()); + + PointerBuffer dpb = PointerBuffer.allocateDirect(32); + PointerBuffer pb = PointerBuffer.allocate(32); + + long[] array = new long[] {1,2,3,4,5,6,7,8,9}; + int offset = 0; + long id = 42; + + // invoke everything public + Method[] methods = bindingTest.getClass().getDeclaredMethods(); + + for (Method method : methods) { + + // prepare method parameters + Class<?>[] paramTypes = method.getParameterTypes(); + Object[] paramInstances = new Object[paramTypes.length]; + + for (int i = 0; i < paramTypes.length; i++) { + Class<?> paramType = paramTypes[i]; + if(paramType.isInstance(dbb)) { + paramInstances[i] = dbb; + }else if(paramType.isInstance(bb)) { + paramInstances[i] = bb; + }else if(paramType.isInstance(dpb)) { + paramInstances[i] = dpb; + }else if(paramType.isInstance(pb)) { + paramInstances[i] = pb; + }else if(paramType.isPrimitive()) { // TODO primitive types + paramInstances[i] = offset; + }else if(paramType.isArray()) { // TODO array types + paramInstances[i] = array; + } + } + + out.println("invoking: "+method); + out.println("with params: "); + for (Object param : paramInstances) + out.print(param+", "); + out.println(); + + // TODO fix Exception: ...Caused by: java.lang.UnsatisfiedLinkError: test.BindingTest.arrayTest0(JLjava/lang/Object;I)I + + Object result = method.invoke(bindingTest, paramInstances); + out.println("result: "+result); + out.println("success"); + } + + } + + +} diff --git a/test/junit/com/sun/gluegen/build.xml b/test/junit/com/sun/gluegen/build.xml new file mode 100644 index 0000000..cdc11ea --- /dev/null +++ b/test/junit/com/sun/gluegen/build.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<project name="GlueGenTest" default="default" basedir="."> + + <description>Tests GlueGen</description> + + <property name="gluegen.root" value="${basedir}" /> + <property name="build.dir" value="${gluegen.root}/build/test/build" /> + <property name="src.dir" value="${gluegen.root}/build/test/gensrc/java" /> + + <!-- Pull in GlueGen cpptasks build file --> + <import file="${gluegen.root}/make/gluegen-cpptasks.xml" /> + + <target name="compile.java" depends="c.configure.linux"> + + <echo message=" - - - compiling java files - - - "/> + <property name="build.dir.java" value="${build.dir}/classes"/> + <echo message="src: ${src.dir} "/> + <echo message="build: ${build.dir.java} "/> + + <mkdir dir="${build.dir.java}"/> + + <javac destdir="${build.dir.java}" includes="test/**" source="1.5" debug="true" verbose="true" debuglevel="lines,vars,source"> + <src path="${src.dir}"/> + <classpath path="build/test/build/java:build/classes:build/test/gensrc/java:lib/antlr-2.7.7.jar:lib/junit-4.5.jar:${jdk.home}/lib/tools.jar:${ant.core.lib}"/> + </javac> + + <echo message=" - - - java files compiled - - - "/> + + </target> + + <target name="compile.native" depends="c.configure.linux"> + + <echo message=" - - - compiling natives - - - "/> + + <property name="obj.dir" value="${build.dir}/obj"/> + <property name="natives.dir" value="${build.dir}/natives"/> + + <property name="output.lib.name" value="rofl"/> + <property name="obj.dir" value="${obj.dir}/${output.lib.name}"/> + <property name="natives.dir" value="${build.dir}/natives/${output.lib.name}"/> + + <property name="c.compiler.optimise" value="none"/> + <property name="c.compiler.debug" value="false"/> + + <mkdir dir="${obj.dir}" /> + <mkdir dir="${natives.dir}" /> + + <cc outtype="shared" + objdir="${obj.dir}" + outfile="${natives.dir}/${output.lib.name}" + optimize="${c.compiler.optimise}" + debug="${c.compiler.debug}" + multithreaded="true" + exceptions="false" + rtti="false" + failonerror="true"> + + <fileset dir="${gluegen.root}/test/junit/com/sun/gluegen" includes="*.c"/> + + <compiler extends="${compiler.cfg.id}" > + <includepath path="${java.includes.dir}"/> + <includepath path="${java.includes.dir.platform}"/> + <includepath path="${gluegen.root}/test/junit/com/sun/gluegen"/> + </compiler> + + <linker extends="${linker.cfg.id}"> + + </linker> + </cc> + + <echo message=" - - - natives compiled - - - "/> + + <copy todir="${natives.dir}"> + <fileset dir="${gluegen.root}/build/obj"> + <include name="*.so"/> + </fileset> + </copy> + + </target> + + <target name="c.configure.linux" depends="gluegen.cpptasks.detect.os,gluegen.cpptasks.setup.compiler"> + + <echo message="configure for Linux.AMD64 build" /> + + <linker id="linker.cfg.linux.amd64.test"> + </linker> + + <property name="compiler.cfg.id" value="compiler.cfg.linux" /> + <property name="linker.cfg.id" value="linker.cfg.linux.amd64.test" /> + </target> + +</project> diff --git a/test/junit/com/sun/gluegen/test.c b/test/junit/com/sun/gluegen/test.c new file mode 100644 index 0000000..d8c26a1 --- /dev/null +++ b/test/junit/com/sun/gluegen/test.c @@ -0,0 +1,17 @@ +#include "test.h" + +int arrayTest(long context, foo * array) { + return 42; +} + +int bufferTest(void * object) { + return 42; +} + +int mixedTest(long context, void * object, foo * array){ + return 42; +} + +int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2) { + return 42; +} diff --git a/test/junit/com/sun/gluegen/test.cfg b/test/junit/com/sun/gluegen/test.cfg new file mode 100644 index 0000000..a709897 --- /dev/null +++ b/test/junit/com/sun/gluegen/test.cfg @@ -0,0 +1,7 @@ +Package test +Style AllStatic +JavaClass BindingTest +JavaOutputDir java +NativeOutputDir native + +CustomCCode #include "test.h" diff --git a/test/junit/com/sun/gluegen/test.h b/test/junit/com/sun/gluegen/test.h new file mode 100644 index 0000000..02a22c1 --- /dev/null +++ b/test/junit/com/sun/gluegen/test.h @@ -0,0 +1,10 @@ + +typedef unsigned long foo; + +int arrayTest(long context, foo * array ); + +int bufferTest(void * object); + +int mixedTest(long context, void * object, foo * array ); + +int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2 ); |