/** * 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. */ // // This source code implements specifications defined by the Java // Community Process. In order to remain compliant with the specification // DO NOT add / change / or delete method signatures! // package javax.ejb; import org.junit.Assert; import org.junit.Test; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; public class EJBExceptionTest { private static final EJBException exceptionDefaultConstructor = new EJBException(); private static final EJBException exceptionWithNullMessage = new EJBException((String) null); private static final EJBException exceptionWithMessage = new EJBException("msg"); private static final EJBException exceptionWithCausedBy = createException(true, false); private static final EJBException exceptionWithInitCause = createException(false, true); private static final EJBException exceptionWithCausedByAndInitCause = createException(true, true); private static final EJBException exceptionWithDifferentCausedByAndInitCause = (EJBException) createException(true, false).initCause(new RuntimeException("initCause")); private static EJBException createException(boolean causedBy, boolean initCause) { try { throw new Exception("cause"); } catch (Exception ex) { EJBException ejbException = causedBy ? new EJBException("msg", ex) : new EJBException("msg"); if (initCause) { ejbException.initCause(ex); } return ejbException; } } @Test public void testGetMessage() { Assert.assertEquals(null, exceptionDefaultConstructor.getMessage()); Assert.assertEquals(null, exceptionWithNullMessage.getMessage()); Assert.assertEquals("msg", exceptionWithMessage.getMessage()); Assert.assertEquals("msg; nested exception is: java.lang.Exception: cause", exceptionWithCausedBy.getMessage()); Assert.assertEquals("msg", exceptionWithInitCause.getMessage()); Assert.assertEquals("msg; nested exception is: java.lang.Exception: cause", exceptionWithCausedByAndInitCause.getMessage()); // TODO Define this behavior // Assert.assertEquals("msg; nested exception is: java.lang.RuntimeException: initCause", exceptionWithDifferentCausedByAndInitCause.getMessage()); } @Test public void testGetCause() { Assert.assertNull(exceptionDefaultConstructor.getCause()); Assert.assertNull(exceptionWithNullMessage.getCause()); Assert.assertNull(exceptionWithMessage.getCause()); Assert.assertNotNull(exceptionWithCausedBy.getCause()); Assert.assertNotNull(exceptionWithInitCause.getCause()); Assert.assertNotNull(exceptionWithCausedByAndInitCause.getCause()); Assert.assertNotNull(exceptionWithDifferentCausedByAndInitCause.getCause()); } @Test public void testGetCausedByException() { Assert.assertNull(exceptionDefaultConstructor.getCausedByException()); Assert.assertNull(exceptionWithNullMessage.getCausedByException()); Assert.assertNull(exceptionWithMessage.getCausedByException()); Assert.assertSame(exceptionWithCausedBy.getCause(), exceptionWithCausedBy.getCausedByException()); Assert.assertNull(exceptionWithInitCause.getCausedByException()); Assert.assertNotNull(exceptionWithCausedByAndInitCause.getCausedByException()); Assert.assertNotNull(exceptionWithDifferentCausedByAndInitCause.getCausedByException()); } @Test public void testInitCause() { Exception cause1 = new Exception("cause1"); Exception cause2 = new Exception("cause2"); EJBException ejbEx = new EJBException(cause1); Assert.assertSame(cause1, ejbEx.getCausedByException()); Assert.assertSame(cause1, ejbEx.getCause()); ejbEx.initCause(cause2); Assert.assertSame(cause1, ejbEx.getCausedByException()); Assert.assertSame(cause2, ejbEx.getCause()); } private static final String[] printStackTraces(Throwable t) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); t.printStackTrace(new PrintStream(baos)); StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter(sw)); return new String[]{new String(baos.toByteArray()), sw.toString()}; } private static String highlight(String s) { return ">>>" + s + "<<<"; } private void assertStackTrace(String s, String... pieces) throws IOException { BufferedReader br = new BufferedReader(new StringReader(s)); int pos = 0; for (String line; (line = br.readLine()) != null; ) { if (line.startsWith("\tat") && (pos > 0 && pieces[pos - 1].equals("\tat"))) { continue; } if (pos == pieces.length) { Assert.fail("unexpected lines" + System.getProperty("line.separator") + highlight(s)); } if (!line.startsWith(pieces[pos])) { Assert.fail(highlight(line) + " does not start with piece " + (pos + 1) + " " + highlight(pieces[pos]) + System.getProperty("line.separator") + highlight(s)); } pos++; } if (pos != pieces.length) { Assert.fail("expected piece " + (pos + 1) + System.getProperty("line.separator") + highlight(s)); } } @Test public void testPrintStackTrace() throws Exception { for (String s : printStackTraces(exceptionDefaultConstructor)) { assertStackTrace(s, "javax.ejb.EJBException", "\tat"); } for (String s : printStackTraces(exceptionWithNullMessage)) { assertStackTrace(s, "javax.ejb.EJBException", "\tat"); } for (String s : printStackTraces(exceptionWithMessage)) { assertStackTrace(s, "javax.ejb.EJBException", "\tat"); } for (String s : printStackTraces(exceptionWithCausedBy)) { assertStackTrace(s, "javax.ejb.EJBException: msg; nested exception", "\tat", "Caused by", "\tat", "\t..."); } for (String s : printStackTraces(exceptionWithInitCause)) { assertStackTrace(s, "javax.ejb.EJBException", "\tat", "Caused by", "\tat", "\t..."); } for (String s : printStackTraces(exceptionWithCausedByAndInitCause)) { assertStackTrace(s, "javax.ejb.EJBException: msg; nested exception", "\tat", "Caused by", "\tat", "\t..."); } for (String s : printStackTraces(new EJBException(new Exception("cause1")).initCause(new Exception("cause2")))) { assertStackTrace(s, "javax.ejb.EJBException: nested exception is: java.lang.Exception: cause1", "java.lang.Exception: cause1", "\tat", "javax.ejb.EJBException: nested exception is: java.lang.Exception: cause1", "\tat", "Caused by: java.lang.Exception: cause2", "\t..."); } } }