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 /test | |
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.
Diffstat (limited to 'test')
-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 |
5 files changed, 333 insertions, 0 deletions
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 ); |