/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ class NativeException { static boolean verbose = true; // set to true to get messages for each test static boolean allTestPass = true; public static native void setVerboseOff(); /** * Declare native methods that will call the JNI Array Functions */ static native boolean testPassThrough(int[] sourceArray); static native boolean testExceptionOccured(int[] sourceArray); static native boolean testExceptionClear(int[] sourceArray); static native boolean testExceptionDescribe(int[] sourceArray); static native boolean testExceptionThrow(Throwable e); static native boolean testExceptionThrowNew(Class eclass); static native boolean testFatalError(boolean allTestPass, int[] sourceArray); NativeException() { } public static void main(String[] args) { boolean returnFlag; int[] intArray = new int[10]; System.loadLibrary("NativeException"); if (args.length != 0) { if (args[0].equals("-quiet")) { verbose = false; setVerboseOff(); } } /**************************************************** * Exception passing through native code without being handled */ try { returnFlag = testPassThrough(intArray); // shouldn't return here returnFlag = false; } catch (RuntimeException e) { printVerbose("Caught exception: expected ArrayIndexOutOfBoundsException, got " + e.toString()); returnFlag = true; } checkTest(0, returnFlag, "Exception pass through"); /**************************************************** * check for exception in native code */ try { returnFlag = testExceptionOccured(intArray); // shouldn't return here returnFlag = false; } catch (RuntimeException e) { returnFlag = true; } checkTest(0, returnFlag, "Exception handled in native code"); /**************************************************** * check for exception being cleared in native code */ try { returnFlag = testExceptionClear(intArray); } catch (RuntimeException e) { returnFlag = false; // shouldn't be here } checkTest(0, returnFlag, "ExceptionClear"); /**************************************************** * print exception trace and clear */ if (verbose) { // disable when 'quiet' due to differences in jdk & RVM // printing in stack traces. Causes spurious test failure. try { returnFlag = testExceptionDescribe(intArray); } catch (RuntimeException e) { returnFlag = false; // shouldn't be here } checkTest(0, returnFlag, "ExceptionDescribe"); } /**************************************************** * give the native code an exception to throw */ try { returnFlag = testExceptionThrow(new Exception("Test Throw in native")); returnFlag = false; // shouldn't be here } catch (Throwable e) { printVerbose("Caught exception: got " + e.toString()); returnFlag = true; } checkTest(0, returnFlag, "ExceptionThrow"); /**************************************************** * give the native code an exception class to throw */ try { Class ecls = Class.forName("java.lang.Exception"); returnFlag = testExceptionThrowNew(ecls); returnFlag = false; // shouldn't be here } catch (ClassNotFoundException e1) { returnFlag = false; // shouldn't be here } catch (Exception e) { printVerbose("Caught exception: got " + e.toString()); returnFlag = true; } checkTest(0, returnFlag, "ExceptionThrowNew"); /**************************************************** * let the native code declare FatalError and exit the JVM try { returnFlag = testFatalError(allTestPass, intArray); returnFlag = false; // shouldn't be here } catch (RuntimeException e) { returnFlag = false; // shouldn't be here } checkTest(0, returnFlag, "FatalError"); */ // Summarize if (allTestPass) System.out.println("PASS: NativeException"); // won't reach here if FatalError test succeeds else System.out.println("FAIL: NativeException"); } static void printVerbose(String str) { if (verbose) System.out.println(str); } static void checkTest(int returnValue, boolean postCheck, String testName) { if (returnValue == 0 && postCheck) { printVerbose("PASS: " + testName); } else { allTestPass = false; printVerbose("FAIL: " + testName); } } }