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