001 /*****************************************************************************
002 * Copyright (C) PicoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 * Original code by Joerg Schaible *
009 *****************************************************************************/
010 package org.picocontainer.defaults;
011
012 import java.io.ByteArrayOutputStream;
013 import java.io.IOException;
014 import java.io.PrintStream;
015 import java.io.PrintWriter;
016 import java.util.HashSet;
017 import java.util.Iterator;
018 import java.util.List;
019 import java.util.Set;
020
021 import junit.framework.TestCase;
022
023 import org.picocontainer.ComponentAdapter;
024 import org.picocontainer.PicoException;
025 import org.picocontainer.PicoInitializationException;
026 import org.picocontainer.PicoInstantiationException;
027 import org.picocontainer.PicoIntrospectionException;
028 import org.picocontainer.PicoRegistrationException;
029
030 /**
031 * Unit tests for the several PicoException classes.
032 */
033 public class PicoExceptionsTestCase
034 extends TestCase {
035
036 final static public String MESSAGE = "Message of the exception";
037 final static public Throwable THROWABLE = new Throwable();
038
039 final void executeTestOfStandardException(final Class clazz) {
040 final ComponentAdapter componentAdapter = new ConstructorInjectionComponentAdapter(clazz, clazz, null, true, new DelegatingComponentMonitor());
041 DefaultPicoContainer pico = new DefaultPicoContainer();
042 pico.registerComponentInstance(MESSAGE);
043 try {
044 final Exception exception = (Exception) componentAdapter.getComponentInstance(pico);
045 assertEquals(MESSAGE, exception.getMessage());
046 } catch (final UnsatisfiableDependenciesException ex) {
047 final Set set = new HashSet();
048 for (final Iterator iter = ex.getUnsatisfiableDependencies().iterator(); iter.hasNext();) {
049 final List list = (List) iter.next();
050 set.addAll(list);
051 }
052 assertTrue(set.contains(Throwable.class));
053 }
054 pico = new DefaultPicoContainer();
055 pico.registerComponentInstance(THROWABLE);
056 try {
057 final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico);
058 assertSame(THROWABLE, exception.getCause());
059 } catch (final UnsatisfiableDependenciesException ex) {
060 final Set set = new HashSet();
061 for (final Iterator iter = ex.getUnsatisfiableDependencies().iterator(); iter.hasNext();) {
062 final List list = (List) iter.next();
063 set.addAll(list);
064 }
065 assertTrue(set.contains(String.class));
066 }
067 pico.registerComponentInstance(MESSAGE);
068 final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico);
069 assertEquals(MESSAGE, exception.getMessage());
070 assertSame(THROWABLE, exception.getCause());
071 }
072
073 public void testPicoInitializationException() {
074 executeTestOfStandardException(PicoInitializationException.class);
075 }
076
077 public void testPicoInitializationExceptionWithDefaultConstructor() {
078 TestException e = new TestException();
079 assertNull(e.getMessage());
080 assertNull(e.getCause());
081 }
082
083 private static class TestException extends PicoInitializationException {
084
085 }
086
087 public void testPicoInstantiationException() {
088 executeTestOfStandardException(PicoInstantiationException.class);
089 }
090
091 public void testPicoIntrospectionException() {
092 executeTestOfStandardException(PicoIntrospectionException.class);
093 }
094
095 public void testPicoRegistrationException() {
096 executeTestOfStandardException(PicoRegistrationException.class);
097 }
098
099 public void testCyclicDependencyException() {
100 final CyclicDependencyException cdEx = new CyclicDependencyException(getClass());
101 cdEx.push(String.class);
102 final Class[] classes = cdEx.getDependencies();
103 assertEquals(2, classes.length);
104 assertSame(getClass(), classes[0]);
105 assertSame(String.class, classes[1]);
106 assertTrue(cdEx.getMessage().indexOf(getClass().getName()) >= 0);
107 }
108
109 public void testPrintStackTrace() throws IOException {
110 PicoException nestedException = new PicoException("Outer", new Exception("Inner")) {
111 };
112 PicoException simpleException = new PicoException("Outer") {
113 };
114 ByteArrayOutputStream out = new ByteArrayOutputStream();
115 PrintStream printStream = new PrintStream(out);
116 nestedException.printStackTrace(printStream);
117 simpleException.printStackTrace(printStream);
118 out.close();
119 assertTrue(out.toString().indexOf("Caused by:") > 0);
120 out = new ByteArrayOutputStream();
121 PrintWriter writer = new PrintWriter(out);
122 nestedException.printStackTrace(writer);
123 simpleException.printStackTrace(writer);
124 writer.flush();
125 out.close();
126 assertTrue(out.toString().indexOf("Caused by:") > 0);
127 //simpleException.printStackTrace();
128 }
129 }