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(),
047                                                                              new NullLifecycleStrategy(), false, false);
048            DefaultPicoContainer pico = new DefaultPicoContainer();
049            pico.addComponent(MESSAGE);
050            try {
051                final Exception exception = (Exception) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
052                assertEquals(MESSAGE, exception.getMessage());
053            } catch (final AbstractInjector.UnsatisfiableDependenciesException ex) {
054                final Set<Object> set = new HashSet<Object>();
055                for (Object o : ex.getUnsatisfiableDependencies()) {
056                    final List<Object> list = (List<Object>)o;
057                    set.addAll(list);
058                }
059                assertTrue(set.contains(Throwable.class));
060            }
061            pico = new DefaultPicoContainer();
062            pico.addComponent(THROWABLE);
063            try {
064                final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
065                assertSame(THROWABLE, exception.getCause());
066            } catch (final AbstractInjector.UnsatisfiableDependenciesException ex) {
067                final Set<Object> set = new HashSet<Object>();
068                for (Object o : ex.getUnsatisfiableDependencies()) {
069                    final List<Object> list = (List<Object>)o;
070                    set.addAll(list);
071                }
072                assertTrue(set.contains(String.class));
073            }
074            pico.addComponent(MESSAGE);
075            final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
076            assertEquals(MESSAGE, exception.getMessage());
077            assertSame(THROWABLE, exception.getCause());
078        }
079    
080        @Test public void testPicoInitializationException() {
081            executeTestOfStandardException(PicoCompositionException.class);
082        }
083    
084        @Test public void testPicoInitializationExceptionWithDefaultConstructor() {
085            TestException e = new TestException(null);
086            assertNull(e.getMessage());
087            assertNull(e.getCause());
088        }
089    
090        private static class TestException extends PicoCompositionException {
091            public TestException(final String message) {
092                super(message);
093            }
094        }
095    
096        @Test public void testPrintStackTrace() throws IOException {
097            PicoException nestedException = new PicoException("Outer", new Exception("Inner")) {
098            };
099            PicoException simpleException = new PicoException("Outer") {
100            };
101            ByteArrayOutputStream out = new ByteArrayOutputStream();
102            PrintStream printStream = new PrintStream(out);
103            nestedException.printStackTrace(printStream);
104            simpleException.printStackTrace(printStream);
105            out.close();
106            assertTrue(out.toString().indexOf("Caused by:") > 0);
107            out = new ByteArrayOutputStream();
108            PrintWriter writer = new PrintWriter(out);
109            nestedException.printStackTrace(writer);
110            simpleException.printStackTrace(writer);
111            writer.flush();
112            out.close();
113            assertTrue(out.toString().indexOf("Caused by:") > 0);
114            //simpleException.printStackTrace();
115        }
116    }