/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.qpid; import junit.framework.TestCase; import org.apache.qpid.framing.AMQFrameDecodingException; import org.apache.qpid.framing.AMQShortString; import org.apache.qpid.protocol.AMQConstant; /** * This test is to ensure that when an AMQException is rethrown that the specified exception is correctly wrapped up. * * There are three cases: * Re-throwing an AMQException * Re-throwing a Subclass of AMQException * Re-throwing a Subclass of AMQException that does not have the default AMQException constructor which will force the * creation of an AMQException. */ public class AMQExceptionTest extends TestCase { /** * Test that an AMQException will be correctly created and rethrown. */ public void testRethrowGeneric() { AMQException test = new AMQException(AMQConstant.ACCESS_REFUSED, "refused", new RuntimeException()); AMQException e = reThrowException(test); assertEquals("Exception not of correct class", AMQException.class, e.getClass()); } /** * Test that a subclass of AMQException that has the default constructor will be correctly created and rethrown. */ public void testRethrowAMQESubclass() { AMQFrameDecodingException test = new AMQFrameDecodingException(AMQConstant.INTERNAL_ERROR, "Error", new Exception()); AMQException e = reThrowException(test); assertEquals("Exception not of correct class", AMQFrameDecodingException.class, e.getClass()); } /** * Test that a subclass of AMQException that doesnot have the default constructor will be correctly rethrown as an * AMQException */ public void testRethrowAMQESubclassNoConstructor() { AMQExceptionSubclass test = new AMQExceptionSubclass("Invalid Argument Exception"); AMQException e = reThrowException(test); assertEquals("Exception not of correct class", AMQException.class, e.getClass()); } /** * Private method to rethrown and validate the basic values of the rethrown * @param test Exception to rethrow * @throws AMQException the rethrown exception */ private AMQException reThrowException(AMQException test) { AMQException amqe = test.cloneForCurrentThread(); assertEquals("Error code does not match.", test.getErrorCode(), amqe.getErrorCode()); assertTrue("Exception message does not start as expected.", amqe.getMessage().startsWith(test.getMessage())); assertEquals("Test Exception is not set as the cause", test, amqe.getCause()); assertEquals("Cause is not correct", test.getCause(), amqe.getCause().getCause()); return amqe; } public void testGetMessageAsString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 25; i++) { sb.append("message [" + i + "]"); } AMQException e = new AMQException(AMQConstant.INTERNAL_ERROR, sb.toString(), null); AMQShortString message = e.getMessageAsShortString(); assertEquals(sb.substring(0, AMQShortString.MAX_LENGTH - 3) + "...", message.toString()); } /** * Private class that extends AMQException but does not have a default exception. */ private class AMQExceptionSubclass extends AMQException { public AMQExceptionSubclass(String msg) { super(null, msg, null); } } }