/* ExceptionRaising.java -- Tests which check that the exceptions raised in an InvocationHandler are correct. Copyright (C) 2006 Olivier Jolly <olivier.jolly@pcedev.com> This file is part of Mauve. Mauve 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, or (at your option) any later version. Mauve 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 Mauve; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ // Tags: JDK1.3 package gnu.testlet.wonka.lang.reflect.Proxy; import gnu.testlet.TestHarness; import gnu.testlet.Testlet; import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; /** * Tests about the exceptions throwable when using proxies * @author Olivier Jolly <olivier.jolly@pcedev.com> * @see java.lang.reflect.Proxy */ public class ExceptionRaising implements Testlet { public void test(TestHarness harness) { testWrappedException(harness); testReturnNull(harness); testClassCastException(harness); } /** * Test the behaviour of proxy the invocation of which returns * <code>null</code> * @param harness * the test harness */ private void testReturnNull(TestHarness harness) { Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { Serializable.class }, new NullInvocationHandler()); try { proxy.getClass(); harness.checkPoint("Passed returning null when a non primitive object is expected"); } catch (Exception e) { harness.fail("Returning null should be safe when a non primitive object is expected"); } try { proxy.hashCode(); harness.fail("Returning null when a primitive return value is expected should have thrown an exception"); } catch (Exception e) { harness.check(e instanceof NullPointerException, "Checking that exception thrown is a NullPointerException"); } } /** * Tests the behaviour of proxy the invocation of which throws an exception * @param harness * the test harness */ private void testWrappedException(TestHarness harness) { Exception exception = new Exception(); Object proxy = Proxy.newProxyInstance( this.getClass().getClassLoader(), new Class[] { Serializable.class }, new ExceptionInvocationHandler( exception)); try { proxy.toString(); harness.fail("Call to toString via a proxy should have failed with an exception"); } catch (UndeclaredThrowableException e) { harness.check(e.getUndeclaredThrowable(), exception, "Exception thrown check"); } } /** * Tests that if the return value is incorrect, a ClassCastException is thrown * @param harness * the test harness */ private void testClassCastException(TestHarness harness) { Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { Serializable.class }, new ThisInvocationHandler()); try { proxy.toString(); } catch (Exception e) { harness.check(e instanceof ClassCastException, "Checking that the raised exception was a ClassPathException"); } } private static class ExceptionInvocationHandler implements InvocationHandler { Exception exception; public ExceptionInvocationHandler(Exception exception) { this.exception = exception; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { throw exception; } } private static class NullInvocationHandler implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } } private static class ThisInvocationHandler implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return this; } } }