From 79e0951cfdb5fb2371df23edeaf7f8957b0ee3f5 Mon Sep 17 00:00:00 2001 From: Michael Bien Date: Sun, 18 Oct 2009 19:17:30 +0200 Subject: added first JUnit test: GlueGenTest.java. (dependencies: junit-4.5.jar, antlr-2.7.7.jar in /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. --- nbproject/ide-file-targets.xml | 61 ++++++++ nbproject/project.xml | 106 +++++++++++++- test/junit/com/sun/gluegen/GlueGenTest.java | 206 ++++++++++++++++++++++++++++ test/junit/com/sun/gluegen/build.xml | 93 +++++++++++++ test/junit/com/sun/gluegen/test.c | 17 +++ test/junit/com/sun/gluegen/test.cfg | 7 + test/junit/com/sun/gluegen/test.h | 10 ++ 7 files changed, 497 insertions(+), 3 deletions(-) create mode 100644 nbproject/ide-file-targets.xml create mode 100644 test/junit/com/sun/gluegen/GlueGenTest.java create mode 100644 test/junit/com/sun/gluegen/build.xml create mode 100644 test/junit/com/sun/gluegen/test.c create mode 100644 test/junit/com/sun/gluegen/test.cfg create mode 100644 test/junit/com/sun/gluegen/test.h 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 @@ + + + + + + + + + + Must set property 'files' + + + + + + + + + + Must set property 'run.class' + + + + + + + + + + Must set property 'run.class' + + + + + + + + + + + + + + Must set property 'debug.class' + + + + + + + + + + + + + + + + + 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 @@ build/gensrc/java UTF-8 + + + java + test/junit + UTF-8 + + + + java + build/test + UTF-8 + @@ -44,10 +56,74 @@ clean all + + + run-selected-file-in-junit + + run.class + test/junit + \.java$ + java-name + + + + + + + + test-selected-file-in-junit + + run.class + test/junit + \.java$ + java-name + + + + + + + + compile-selected-files-in-junit + + files + test/junit + \.java$ + relative-path + + , + + + + + + debug-selected-file-in-junit + + debug.class + test/junit + \.java$ + java-name + + + + + folder - bin + build/classes + + all + + + folder + build/classes + + all + + + folder + build/classes all @@ -61,6 +137,14 @@ build/gensrc/java + + + test/junit + + + + build/test + ${ant.script} @@ -73,12 +157,28 @@ - + src/java + build/classes:lib/antlr-2.7.7.jar:${jdk.home}/lib/tools.jar:${ant.core.lib} + build/classes + 1.5 + + build/gensrc/java build/classes:lib/antlr-2.7.7.jar:${jdk.home}/lib/tools.jar:${ant.core.lib} - bin + build/classes + 1.5 + + + test/junit + + 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 + build/classes + 1.5 + + + build/test 1.5 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 collector = new DiagnosticCollector(); + StandardJavaFileManager fileManager = compiler.getStandardFileManager(collector, null, null); + + Iterable fileObj = fileManager.getJavaFileObjects(source); + + compiler.getTask( new OutputStreamWriter(out), + fileManager, + collector, + Arrays.asList("-d",output+"/build/java","-verbose"), + null, + fileObj ).call(); + + List> list = collector.getDiagnostics(); + if(!list.isEmpty()) { + for (Diagnostic 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 @@ + + + + + Tests GlueGen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 ); -- cgit v1.2.3