This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: FYI: CNI test directory
- From: Tom Tromey <tromey at redhat dot com>
- To: GCC libjava patches <java-patches at gcc dot gnu dot org>
- Date: 22 Mar 2003 00:09:51 -0700
- Subject: Patch: FYI: CNI test directory
- Reply-to: tromey at redhat dot com
I'm checking this in on the trunk.
This adds support for CNI tests to the libjava test suite.
This patch also adds a couple tests. One, shortfield, is the test
that Andrew wrote for the old gcj/g++ layout disagreement. The other,
longfield, shows the current Process bug.
Tom
Index: libjava/testsuite/ChangeLog
from Tom Tromey <tromey at redhat dot com>
* lib/libjava.exp (gcj_invoke): Moved...
* libjava.jni/jni.exp: ...from here.
* libjava.cni/shortfield.out: New file.
* libjava.cni/shortfield.java: New file.
* libjava.cni/natshortfield.cc: New file.
* libjava.cni/natlongfield.cc: New file.
* libjava.cni/longfield.out: New file.
* libjava.cni/longfield.java: New file.
* libjava.cni/cni.exp: New file.
Index: libjava/testsuite/lib/libjava.exp
===================================================================
RCS file: /cvs/gcc/gcc/libjava/testsuite/lib/libjava.exp,v
retrieving revision 1.50
diff -u -r1.50 libjava.exp
--- libjava/testsuite/lib/libjava.exp 15 Feb 2003 16:39:28 -0000 1.50
+++ libjava/testsuite/lib/libjava.exp 22 Mar 2003 07:12:33 -0000
@@ -457,6 +457,50 @@
return 1
}
+# Invoke the program and see what happens. Return 0 on failure.
+proc gcj_invoke {program expectFile ld_library_additions} {
+ global env
+ set lib_path $env(LD_LIBRARY_PATH)
+
+ set newval .
+ if {[llength $ld_library_additions] > 0} {
+ append newval :[join $ld_library_additions :]
+ }
+ append newval :$lib_path
+
+ setenv LD_LIBRARY_PATH $newval
+ setenv SHLIB_PATH $newval
+
+ verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)"
+
+ set result [libjava_load ./$program]
+ set status [lindex $result 0]
+ set output [lindex $result 1]
+
+ # Restore setting
+ setenv LD_LIBRARY_PATH $lib_path
+ setenv SHLIB_PATH $lib_path
+
+ if {$status != "pass"} {
+ verbose "got $output"
+ fail "$program run"
+ untested "$program output"
+ return 0
+ }
+
+ set id [open $expectFile r]
+ set expected [read $id]
+ close $id
+
+ if {! [string compare $output $expected]} {
+ pass "$program output"
+ return 1
+ } else {
+ fail "$program output"
+ return 0
+ }
+}
+
# Invoke a program and check its output. EXECUTABLE is the program;
# ARGS are the arguments to the program. Returns 1 if tests passed
# (or things were left untested), 0 otherwise.
Index: libjava/testsuite/libjava.cni/cni.exp
===================================================================
RCS file: libjava/testsuite/libjava.cni/cni.exp
diff -N libjava/testsuite/libjava.cni/cni.exp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/cni.exp 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1,119 @@
+# Tests for CNI code.
+
+# Compile a single C++ file and produce a .o file. OPTIONS is a list
+# of options to pass to the compiler. Returns 0 on failure, 1 on
+# success.
+proc gcj_cni_compile_cxx_to_o {file {options {}}} {
+ global srcdir
+
+ set name [file rootname [file tail $file]]
+ set oname ${name}.o
+
+ # Find the generated header.
+ lappend options "additional_flags=-I. -I.."
+ # Find libgcj headers.
+ lappend options "additional_flags=-I$srcdir/.."
+
+ set x [libjava_prune_warnings \
+ [target_compile $file $oname object $options]]
+ if {$x != ""} {
+ verbose "target_compile failed: $x" 2
+ fail "[file tail $file] compilation"
+ return 0
+ }
+
+ pass "[file tail $file] compilation"
+ return 1
+}
+
+# Build header files given name of .java file. Return 0 on failure.
+proc gcj_cni_build_headers {file} {
+ set gcjh [find_gcjh]
+ set jvscan [find_jvscan]
+
+ set class_out [string trim \
+ [libjava_prune_warnings \
+ [lindex [local_exec "$jvscan --encoding=UTF-8 $file --list-class" "" "" 300] 1]]]
+ if {[string match "*parse error*" $class_out]} {
+ fail "$file header generation"
+ return 0
+ }
+
+ foreach file [split $class_out] {
+ set x [string trim [libjava_prune_warnings \
+ [lindex [local_exec "$gcjh $file" "" "" 300] 1]]]
+ if {$x != ""} {
+ verbose "local_exec failed: $x" 2
+ fail "$file header generation"
+ return 0
+ }
+ }
+
+ pass "$file header generation"
+ return 1
+}
+
+# Do all the work for a single CNI test. Return 0 on failure.
+proc gcj_cni_test_one {file} {
+ global runtests
+
+ # The base name. We use it for several purposes.
+ set main [file rootname [file tail $file]]
+ if {! [runtest_file_p $runtests $main]} {
+ # Simply skip it.
+ return 1
+ }
+
+ if {! [bytecompile_file $file [pwd]]} {
+ fail "bytecompile $file"
+ # FIXME - should use `untested' on all remaining tests.
+ # But that is hard.
+ return 0
+ }
+ pass "bytecompile $file"
+
+ if {! [gcj_cni_build_headers $file]} {
+ # FIXME
+ return 0
+ }
+
+ set cfile [file join [file dirname $file] nat$main.cc]
+ if {! [gcj_cni_compile_cxx_to_o $cfile]} {
+ # FIXME
+ return 0
+ }
+
+ if {! [gcj_link $main $main [list $file nat$main.o]]} {
+ # FIXME
+ return 0
+ }
+
+ if {! [gcj_invoke $main [file rootname $file].out {}]} {
+ # FIXME
+ return 0
+ }
+
+ # When we succeed we remove all our clutter.
+ eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main nat$main.o]
+
+ return 1
+}
+
+# Run the CNI tests.
+proc gcj_cni_run {} {
+ global srcdir subdir
+ global build_triplet host_triplet
+
+ # For now we only test CNI on native builds.
+ if {$build_triplet == $host_triplet} {
+ catch { lsort [glob -nocomplain ${srcdir}/${subdir}/*.java] } srcfiles
+
+ foreach x $srcfiles {
+ gcj_cni_test_one $x
+ }
+ } else {
+ verbose "CNI tests not run in cross-compilation environment"
+ }
+}
+
+gcj_cni_run
Index: libjava/testsuite/libjava.cni/longfield.java
===================================================================
RCS file: libjava/testsuite/libjava.cni/longfield.java
diff -N libjava/testsuite/libjava.cni/longfield.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/longfield.java 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1,22 @@
+public class longfield
+{
+ long lval = 232300;
+ boolean bval = true;
+ String sval = "maude";
+
+ public native void doitc ();
+
+ public void doitj()
+ {
+ System.out.println(lval);
+ System.out.println(bval);
+ System.out.println(sval);
+ }
+
+ public static void main(String[] args)
+ {
+ longfield f = new longfield();
+ f.doitc();
+ f.doitj();
+ }
+}
Index: libjava/testsuite/libjava.cni/longfield.out
===================================================================
RCS file: libjava/testsuite/libjava.cni/longfield.out
diff -N libjava/testsuite/libjava.cni/longfield.out
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/longfield.out 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1,6 @@
+232300
+true
+maude
+232300
+true
+maude
Index: libjava/testsuite/libjava.cni/natlongfield.cc
===================================================================
RCS file: libjava/testsuite/libjava.cni/natlongfield.cc
diff -N libjava/testsuite/libjava.cni/natlongfield.cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/natlongfield.cc 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1,15 @@
+#include <gcj/cni.h>
+
+#include "longfield.h"
+#include <java/lang/System.h>
+#include <java/io/PrintStream.h>
+
+void
+longfield::doitc ()
+{
+ java::io::PrintStream *ps = java::lang::System::out;
+
+ ps->println(lval);
+ ps->println(bval);
+ ps->println(sval);
+}
Index: libjava/testsuite/libjava.cni/natshortfield.cc
===================================================================
RCS file: libjava/testsuite/libjava.cni/natshortfield.cc
diff -N libjava/testsuite/libjava.cni/natshortfield.cc
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/natshortfield.cc 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include "shortfield.h"
+
+void shortfield::ouch ()
+{
+ printf ("list: %d %d 0x%x\n",
+ modCount,
+ size__,
+ data);
+}
Index: libjava/testsuite/libjava.cni/shortfield.java
===================================================================
RCS file: libjava/testsuite/libjava.cni/shortfield.java
diff -N libjava/testsuite/libjava.cni/shortfield.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/shortfield.java 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1,21 @@
+class shortfieldbase
+{
+ short modCount;
+}
+
+public class shortfield extends shortfieldbase
+{
+ short size__;
+ int data;
+
+ native void ouch ();
+
+ public static void main (String[] s)
+ {
+ shortfield f = new shortfield();
+ f.modCount = 99;
+ f.size__ = 2;
+ f.data = 0x12345678;
+ f.ouch();
+ }
+}
Index: libjava/testsuite/libjava.cni/shortfield.out
===================================================================
RCS file: libjava/testsuite/libjava.cni/shortfield.out
diff -N libjava/testsuite/libjava.cni/shortfield.out
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.cni/shortfield.out 22 Mar 2003 07:12:33 -0000
@@ -0,0 +1 @@
+list: 99 2 0x12345678
Index: libjava/testsuite/libjava.jni/jni.exp
===================================================================
RCS file: /cvs/gcc/gcc/libjava/testsuite/libjava.jni/jni.exp,v
retrieving revision 1.9
diff -u -r1.9 jni.exp
--- libjava/testsuite/libjava.jni/jni.exp 13 Dec 2002 05:00:14 -0000 1.9
+++ libjava/testsuite/libjava.jni/jni.exp 22 Mar 2003 07:12:33 -0000
@@ -43,50 +43,6 @@
return 1
}
-# Invoke the program and see what happens. Return 0 on failure.
-proc gcj_invoke {program expectFile ld_library_additions} {
- global env
- set lib_path $env(LD_LIBRARY_PATH)
-
- set newval .
- if {[llength $ld_library_additions] > 0} {
- append newval :[join $ld_library_additions :]
- }
- append newval :$lib_path
-
- setenv LD_LIBRARY_PATH $newval
- setenv SHLIB_PATH $newval
-
- verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)"
-
- set result [libjava_load ./$program]
- set status [lindex $result 0]
- set output [lindex $result 1]
-
- # Restore setting
- setenv LD_LIBRARY_PATH $lib_path
- setenv SHLIB_PATH $lib_path
-
- if {$status != "pass"} {
- verbose "got $output"
- fail "$program run"
- untested "$program output"
- return 0
- }
-
- set id [open $expectFile r]
- set expected [read $id]
- close $id
-
- if {! [string compare $output $expected]} {
- pass "$program output"
- return 1
- } else {
- fail "$program output"
- return 0
- }
-}
-
# Do all the work for a single JNI test. Return 0 on failure.
proc gcj_jni_test_one {file} {
global runtests