ExceptionCaughtDebuggee.java revision 3e35c96b816be002cbdbfd623f2b2d8300f62816
13e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz/* 23e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Licensed to the Apache Software Foundation (ASF) under one or more 33e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * contributor license agreements. See the NOTICE file distributed with 43e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * this work for additional information regarding copyright ownership. 53e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * The ASF licenses this file to You under the Apache License, Version 2.0 63e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * (the "License"); you may not use this file except in compliance with 73e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * the License. You may obtain a copy of the License at 83e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * 93e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * http://www.apache.org/licenses/LICENSE-2.0 103e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * 113e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Unless required by applicable law or agreed to in writing, software 123e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * distributed under the License is distributed on an "AS IS" BASIS, 133e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * 153e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * See the License for the specific language governing permissions and 163e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * limitations under the License. 173e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 183e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 193e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz/** 203e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * @author Anton V. Karnachuk 213e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 223e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 233e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz/** 243e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Created on 11.04.2005 253e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 263e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzpackage org.apache.harmony.jpda.tests.jdwp.Events; 273e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 283e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 293e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.share.SyncDebuggee; 303e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 313e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport java.lang.reflect.InvocationTargetException; 323e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport java.lang.reflect.Method; 333e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 343e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz/** 353e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Debuggee for ExceptionCaughtTest unit test. 363e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Generates caught DebuggeeException exception. 373e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 383e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzpublic class ExceptionCaughtDebuggee extends SyncDebuggee { 393e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz public static final String TEST_EXCEPTION_FROM_NATIVE_METHOD = "FROM_NATIVE"; 403e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 413e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz public static void main(String[] args) { 423e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz runDebuggee(ExceptionCaughtDebuggee.class); 433e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 443e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 453e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz public void run() { 463e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("-- ExceptionCatchDebuggee: STARTED"); 473e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 483e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // Cause loading of DebuggeeException so it is visible from the test. 493e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz new DebuggeeException("dummy exception"); 503e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 513e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 523e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 533e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("-- ExceptionCatchDebuggee: Wait for SGNL_CONTINUE..."); 543e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz String message = synchronizer.receiveMessage(); 553e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("-- ExceptionCatchDebuggee: SGNL_CONTINUE has been received!"); 563e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 573e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz if (message.equals(TEST_EXCEPTION_FROM_NATIVE_METHOD)) { 583e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz testThrowAndCatchExceptionFromNative(); 593e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } else { 603e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz testThrowAndCatchDebuggeeExceptionFromJava(true); 613e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 623e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 633e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("-- ExceptionCatchDebuggee: FINISHing..."); 643e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 653e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 663e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz void testThrowAndCatchDebuggeeExceptionFromJava(boolean nativeTransition) { 673e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("testThrowAndCatchDebuggeeExceptionFromJava"); 683e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz try { 693e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throwAndCatchDebuggeeException(nativeTransition); 703e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } catch (DebuggeeException e) { 713e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("We caught our exception as expected"); 723e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } catch (Throwable e) { 733e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.printError("Unexpected exception", e); 743e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 753e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 763e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 773e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz void throwAndCatchDebuggeeException(boolean nativeTransition) throws Throwable { 783e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz if (nativeTransition) { 793e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throwDebuggeeExceptionWithTransition(); 803e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } else { 813e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throwDebuggeeException(); 823e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 833e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 843e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 853e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz private void throwDebuggeeExceptionWithTransition() throws Throwable { 863e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // We use java reflection to invoke the method throwing the exception through native. 873e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz Method method = getClass().getDeclaredMethod("throwDebuggeeException"); 883e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz try { 893e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz method.invoke(this); 903e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } catch (InvocationTargetException e) { 913e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz if (e.getCause() instanceof DebuggeeException) { 923e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // Rethrow our exception. 933e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throw e.getCause(); 943e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } else { 953e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throw e; 963e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 973e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 983e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 993e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 1003e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz private void throwDebuggeeException() { 1013e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("throwDebuggeeException"); 1023e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throw new DebuggeeException("Caught debuggee exception"); 1033e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 1043e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 1053e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz /** 1063e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Catches a {@link NullPointerException} thrown from a native method. 1073e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 1083e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz private void testThrowAndCatchExceptionFromNative() { 1093e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz logWriter.println("testThrowAndCatchExceptionFromNative"); 1103e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz try { 1113e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz throwNullPointerExceptionFromNative(); 1123e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } catch (NullPointerException e) { 1133e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz System.out.println("Expected exeception"); 1143e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 1153e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 1163e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 1173e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz /** 1183e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Causes a {@link NullPointerException} to be thrown from native method 1193e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * {@link System#arraycopy(Object, int, Object, int, int)}. 1203e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 1213e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz private void throwNullPointerExceptionFromNative() { 1223e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz System.arraycopy((Object) null, 0, (Object) null, 0, 0); 1233e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 1243e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz} 125