summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nbproject/ide-file-targets.xml61
-rwxr-xr-xnbproject/project.xml106
-rw-r--r--test/junit/com/sun/gluegen/GlueGenTest.java206
-rw-r--r--test/junit/com/sun/gluegen/build.xml93
-rw-r--r--test/junit/com/sun/gluegen/test.c17
-rw-r--r--test/junit/com/sun/gluegen/test.cfg7
-rw-r--r--test/junit/com/sun/gluegen/test.h10
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 );