diff options
author | Tom Tromey <tromey@gcc.gnu.org> | 2005-07-16 00:30:23 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2005-07-16 00:30:23 +0000 |
commit | f911ba985aa7fe0096c386c5be385ac5825ea527 (patch) | |
tree | a0b991cf5866ae1d616639b906ac001811d74508 /libjava/classpath/native/testsuite/guile-jvm.c | |
parent | 6f4434b39b261de5317dc81ddfdd94d2e1d62b11 (diff) | |
download | gcc-f911ba985aa7fe0096c386c5be385ac5825ea527.zip gcc-f911ba985aa7fe0096c386c5be385ac5825ea527.tar.gz gcc-f911ba985aa7fe0096c386c5be385ac5825ea527.tar.bz2 |
Initial revision
From-SVN: r102074
Diffstat (limited to 'libjava/classpath/native/testsuite/guile-jvm.c')
-rw-r--r-- | libjava/classpath/native/testsuite/guile-jvm.c | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/libjava/classpath/native/testsuite/guile-jvm.c b/libjava/classpath/native/testsuite/guile-jvm.c new file mode 100644 index 0000000..c372f75 --- /dev/null +++ b/libjava/classpath/native/testsuite/guile-jvm.c @@ -0,0 +1,223 @@ +/* + * Guile/JNI/JVM Testing Framework + * + * Copyright (c) 1998 Free Software Foundation, Inc. + * Written by Paul Fisher (rao@gnu.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <libguile.h> +#include <guile/gh.h> +#include <jni.h> + +static JNIEnv *env; +static jclass test_class, result_class; +static jmethodID test_mid, test_name_mid, result_name_mid, result_msg_mid; + +SCM +abort_test (SCM name, char *exception) +{ + (*env)->ExceptionClear (env); + return gh_list (name, + gh_symbol2scm ("ERROR"), + gh_str02scm (exception), + SCM_UNDEFINED); +} + +SCM +handle_test_exception (jobject test_name_obj) +{ + jthrowable throwable; + jclass object_class; + jobject err_msg_obj; + char *err_msg, *test_name; + const char *utf; + SCM result; + jboolean is_copy; + static jmethodID obj_toString_mid = NULL; + + throwable = (*env)->ExceptionOccurred (env); + (*env)->ExceptionClear (env); + + if (obj_toString_mid == NULL) + obj_toString_mid = (*env)->GetMethodID (env, + (*env)->FindClass (env, + "java/lang/Object"), + "toString", + "()Ljava/lang/String;"); + + err_msg_obj = (*env)->CallObjectMethod (env, throwable, obj_toString_mid); + + utf = (*env)->GetStringUTFChars (env, err_msg_obj, &is_copy); + err_msg = strdup (utf); + (*env)->ReleaseStringUTFChars (env, err_msg_obj, utf); + + utf = (*env)->GetStringUTFChars (env, test_name_obj, &is_copy); + test_name = strdup (utf); + (*env)->ReleaseStringUTFChars (env, test_name_obj, utf); + + result = abort_test (gh_str02scm (test_name), err_msg); + + free (err_msg); + free (test_name); + + return result; +} + +SCM +perform_test (SCM clazz_scm_name) +{ + char *clazz_name, *test_name, *result_name, *msg; + const char *utf; + jclass clazz; + jmethodID mid; + jobject test_obj, result_obj, test_name_obj, result_name_obj, msg_obj; + jboolean is_copy; + SCM scm_test_name, scm_result_name, scm_result_msg; + + clazz_name = gh_scm2newstr (clazz_scm_name, NULL); + clazz = (*env)->FindClass (env, clazz_name); + if (clazz == NULL) + { + SCM clazz_err = gh_str02scm (clazz_name); + free (clazz_name); + return abort_test (clazz_err, "Unable to find class"); + } + + mid = (*env)->GetMethodID (env, clazz, "<init>", "()V"); + test_obj = (*env)->NewObject (env, clazz, mid); + + if ((*env)->IsInstanceOf (env, test_obj, test_class) == JNI_FALSE) + { + SCM clazz_err = gh_str02scm (clazz_name); + free (clazz_name); + return abort_test (clazz_err, "Not an instanceof gnu.test.Test"); + } + free (clazz_name); + + /* Call all the Java testing methods */ + test_name_obj = (*env)->CallObjectMethod (env, test_obj, test_name_mid); + result_obj = (*env)->CallObjectMethod (env, test_obj, test_mid); + + /* Handle an exception if one occurred */ + if ((*env)->ExceptionOccurred (env)) + return handle_test_exception (test_name_obj); + + result_name_obj = (*env)->CallObjectMethod (env, result_obj, + result_name_mid); + msg_obj = (*env)->CallObjectMethod (env, result_obj, result_msg_mid); + + /* Grab all the C result messages */ + utf = (*env)->GetStringUTFChars (env, test_name_obj, &is_copy); + test_name = strdup (utf); + (*env)->ReleaseStringUTFChars (env, test_name_obj, utf); + + utf = (*env)->GetStringUTFChars (env, result_name_obj, &is_copy); + result_name = strdup (utf); + (*env)->ReleaseStringUTFChars (env, result_name_obj, utf); + + utf = (*env)->GetStringUTFChars (env, msg_obj, &is_copy); + msg = strdup (utf); + (*env)->ReleaseStringUTFChars (env, msg_obj, utf); + + /* Convert the C result messages to Scheme */ + scm_test_name = gh_str02scm (test_name); + scm_result_name = gh_symbol2scm (result_name); + scm_result_msg = gh_str02scm (msg); + + /* Free up the C result messages */ + free (test_name); + free (result_name); + free (msg); + + return gh_list (scm_test_name, + scm_result_name, + scm_result_msg, + SCM_UNDEFINED); +} + +int +init_testing_framework () +{ + JavaVM *jvm; + JDK1_1InitArgs vm_args; + + vm_args.version = 0x00010001; + JNI_GetDefaultJavaVMInitArgs (&vm_args); + vm_args.classpath = getenv ("CLASSPATH"); + if (JNI_CreateJavaVM (&jvm, &env, &vm_args) < 0) + return -1; + + test_class = (*env)->FindClass (env, "gnu/test/Test"); + if (test_class == NULL) + { + fprintf (stderr, "Unable to locate gnu.test.Test\n"); + return -1; + } + test_class = (*env)->NewGlobalRef (env, test_class); + + result_class = (*env)->FindClass (env, "gnu/test/Result"); + if (result_class == NULL) + { + fprintf (stderr, "Unable to locate gnu.test.Result\n"); + return -1; + } + result_class = (*env)->NewGlobalRef (env, result_class); + + test_mid = (*env)->GetMethodID (env, test_class, "test", + "()Lgnu/test/Result;"); + test_name_mid = (*env)->GetMethodID (env, test_class, "getName", + "()Ljava/lang/String;"); + if (test_mid == NULL || test_name_mid == NULL) + { + fprintf (stderr, "Malformed gnu.test.Test class\n"); + return -1; + } + + result_name_mid = (*env)->GetMethodID (env, result_class, "getName", + "()Ljava/lang/String;"); + result_msg_mid = (*env)->GetMethodID (env, result_class, "getMsg", + "()Ljava/lang/String;"); + if (result_name_mid == NULL || result_msg_mid == NULL) + { + fprintf (stderr, "Malformed gnu.test.Result class\n"); + return -1; + } + + gh_new_procedure1_0 ("test", perform_test); + return 0; +} + +static void +inner_main (void *closure, int argc, char **argv) +{ + if (init_testing_framework () < 0) + { + fprintf (stderr, "Unable to instantiate JVM.\n"); + exit (1); + } + scm_shell (argc, argv); +} + +int +main (int argc, char **argv) +{ + scm_boot_guile (argc, argv, inner_main, 0); + return 0; +} |