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 static org.junit.Assert.assertEquals;
013    import static org.junit.Assert.assertNull;
014    import static org.junit.Assert.assertSame;
015    import static org.junit.Assert.assertTrue;
016    
017    import java.io.ByteArrayOutputStream;
018    import java.io.IOException;
019    import java.io.PrintStream;
020    import java.io.PrintWriter;
021    import java.util.HashSet;
022    import java.util.List;
023    import java.util.Set;
024    
025    import org.junit.Test;
026    import org.picocontainer.ComponentAdapter;
027    import org.picocontainer.DefaultPicoContainer;
028    import org.picocontainer.PicoCompositionException;
029    import org.picocontainer.PicoException;
030    import org.picocontainer.injectors.AbstractInjector;
031    import org.picocontainer.injectors.ConstructorInjector;
032    import org.picocontainer.lifecycle.NullLifecycleStrategy;
033    import org.picocontainer.monitors.AbstractComponentMonitor;
034    
035    /**
036     * Unit tests for the several PicoException classes.
037     */
038    @SuppressWarnings("serial")
039    public class PicoExceptionsTestCase {
040    
041        final static public String MESSAGE = "Message of the exception";
042        final static public Throwable THROWABLE = new Throwable();
043    
044        @SuppressWarnings({ "unchecked" })
045        final void executeTestOfStandardException(final Class clazz) {
046            final ComponentAdapter componentAdapter = new ConstructorInjector(clazz, clazz, null, new AbstractComponentMonitor(), false, false);
047            DefaultPicoContainer pico = new DefaultPicoContainer();
048            pico.addComponent(MESSAGE);
049            try {
050                final Exception exception = (Exception) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
051                assertEquals(MESSAGE, exception.getMessage());
052            } catch (final AbstractInjector.UnsatisfiableDependenciesException ex) {
053                final Set<Object> set = new HashSet<Object>();
054                for (Object o : ex.getUnsatisfiableDependencies()) {
055                    final List<Object> list = (List<Object>)o;
056                    set.addAll(list);
057                }
058                assertTrue(set.contains(Throwable.class));
059            }
060            pico = new DefaultPicoContainer();
061            pico.addComponent(THROWABLE);
062            try {
063                final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
064                assertSame(THROWABLE, exception.getCause());
065            } catch (final AbstractInjector.UnsatisfiableDependenciesException ex) {
066                final Set<Object> set = new HashSet<Object>();
067                for (Object o : ex.getUnsatisfiableDependencies()) {
068                    final List<Object> list = (List<Object>)o;
069                    set.addAll(list);
070                }
071                assertTrue(set.contains(String.class));
072            }
073            pico.addComponent(MESSAGE);
074            final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
075            assertEquals(MESSAGE, exception.getMessage());
076            assertSame(THROWABLE, exception.getCause());
077        }
078    
079        @Test public void testPicoInitializationException() {
080            executeTestOfStandardException(PicoCompositionException.class);
081        }
082    
083        @Test public void testPicoInitializationExceptionWithDefaultConstructor() {
084            TestException e = new TestException(null);
085            assertNull(e.getMessage());
086            assertNull(e.getCause());
087        }
088    
089        private static class TestException extends PicoCompositionException {
090            public TestException(final String message) {
091                super(message);
092            }
093        }
094    
095        @Test public void testPrintStackTrace() throws IOException {
096            PicoException nestedException = new PicoException("Outer", new Exception("Inner")) {
097            };
098            PicoException simpleException = new PicoException("Outer") {
099            };
100            ByteArrayOutputStream out = new ByteArrayOutputStream();
101            PrintStream printStream = new PrintStream(out);
102            nestedException.printStackTrace(printStream);
103            simpleException.printStackTrace(printStream);
104            out.close();
105            assertTrue(out.toString().indexOf("Caused by:") > 0);
106            out = new ByteArrayOutputStream();
107            PrintWriter writer = new PrintWriter(out);
108            nestedException.printStackTrace(writer);
109            simpleException.printStackTrace(writer);
110            writer.flush();
111            out.close();
112            assertTrue(out.toString().indexOf("Caused by:") > 0);
113            //simpleException.printStackTrace();
114        }
115    }